文字

mysqli::ping

mysqli_ping

(PHP 5)

mysqli::ping -- mysqli_pingPings a server connection, or tries to reconnect if the connection has gone down

说明

面向对象风格

bool mysqli::ping ( void )

过程化风格

bool mysqli_ping ( mysqli $link )

Checks whether the connection to the server is working. If it has gone down, and global option mysqli.reconnect is enabled an automatic reconnection is attempted.

This function can be used by clients that remain idle for a long while, to check whether the server has closed the connection and reconnect if necessary.

参数

link

仅以过程化样式:由 mysqli_connect() mysqli_init() 返回的链接标识。

返回值

成功时返回 TRUE , 或者在失败时返回 FALSE

范例

Example #1 mysqli::ping() example

面向对象风格

<?php
$mysqli 
= new  mysqli ( "localhost" "my_user" "my_password" "world" );


if ( $mysqli -> connect_errno ) {
    
printf ( "Connect failed: %s\n" $mysqli -> connect_error );
    exit();
}


if ( $mysqli -> ping ()) {
    
printf  ( "Our connection is ok!\n" );
} else {
    
printf  ( "Error: %s\n" $mysqli -> error );
}


$mysqli -> close ();
?>

过程化风格

<?php
$link 
mysqli_connect ( "localhost" "my_user" "my_password" "world" );


if ( mysqli_connect_errno ()) {
    
printf ( "Connect failed: %s\n" mysqli_connect_error ());
    exit();
}


if ( mysqli_ping ( $link )) {
    
printf  ( "Our connection is ok!\n" );
} else {
    
printf  ( "Error: %s\n" mysqli_error ( $link ));
}


mysqli_close ( $link );
?>

以上例程会输出:

Our connection is ok!

用户评论:

[#1] root at jusme dot org [2015-09-21 22:00:12]

As jay at grooveshark dot com very helpfully pointed out, the mysqlnd driver which is becoming pretty standard does not obey reconnect commands. If you have a DB wrapper class (which hopefully you do) you can implement your own version of ping() such as:

<?php

class db extends mysqli
{
    private 
$db_host;
    private 
$db_user;
    private 
$db_pass;
    private 
$db_name;
    private 
$persistent;

    public function 
__construct($db_host$db_user$db_pass$db_name$persistent true)
    {
        
$this->db_host $db_host;
        
$this->db_user $db_user;
        
$this->db_pass $db_pass;
        
$this->db_name $db_name;
        
$this->persistent $persistent;

        
parent::init();
        
parent::options(MYSQLI_OPT_CONNECT_TIMEOUT1);
        @
parent::real_connect(($this->persistent 'p:' '') . $this->db_host$this->db_user$this->db_pass$this->db_name);

        if (
$this->connect_errno)
            die(
"All DB servers down!\n");
    }

    public function 
ping()
    {
        @
parent::query('SELECT LAST_INSERT_ID()');

        if (
$this->errno == 2006)
            
$this->__construct($this->db_host$this->db_user$this->db_pass$this->db_name$this->persistent);
    }
...
}

$db = new db(DB_HOSTDB_USERDB_PASSDB_NAME);
// Some code that potentially takes a really long time to execute goes here
// Ping for safety to try to gracefully reconnect
$db->ping();
// Now we should be able to run queries again
$db->query('SELECT LAST_INSERT_ID()');

?>


If you wanted you could even put "$this->ping();" at the top of db::query() to avoid any explicit reconnection calls but I wouldn't recommend it due to the (slight) overhead of running the cheap "SELECT LAST_INSERT_ID()" query every time prior to running your real intended query. There are probably even cheaper queries to run in favor of "SELECT LAST_INSERT_ID()" but it was the first that came to mind and is cheap enough for most purposes since you shouldn't be calling ping() a whole bunch anyway.

[#2] snooops84 at googlemail dot com [2015-02-13 08:56:36]

The behaviour about the option mysqli.reconnect is default set to Off at Debian PHP Packages. So i would recommend to update the first line description about the recommendation at the option mysqli.reconnect. (practice note ;))

[#3] jay at grooveshark dot com [2014-09-27 00:07:05]

This does not work with mysqlnd and is marked as wontfix: https://bugs.php.net/bug.php?id=52561

上一篇: 下一篇: