mysqli::ping

mysqli_ping

(PHP 5, PHP 7)

mysqli::ping -- mysqli_ping Проверяет работоспособность соединения или пытается переподключиться, если соединение разорвано

Описание

Объектно-ориентированный стиль

bool mysqli::ping ( void )

Процедурный стиль

bool mysqli_ping ( mysqli $link )

Проверяет работоспособность соединения с сервером. Если соединение разорвано, а глобальная настройка mysqli.reconnect включена, PHP попытается автоматически переподключиться.

Эта функция может использоваться клиентами, которые простаивают без дела долгое время, чтобы проверить, что сервер их не отключил, и переподключиться в случае необходимости.

Список параметров

link

Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli::ping()

Объектно-ориентированный стиль

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

/* проверка соединения */
if ($mysqli->connect_errno) {
    
printf("Не удалось подключиться: %s\n"$mysqli->connect_error);
    exit();
}

/* проверим, жив ли сервер */
if ($mysqli->ping()) {
    
printf ("Соединение в порядке!\n");
} else {
    
printf ("Ошибка: %s\n"$mysqli->error);
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

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

/* проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Не удалось подключиться: %s\n"mysqli_connect_error());
    exit();
}

/* проверим, жив ли сервер */
if (mysqli_ping($link)) {
    
printf ("Соединение в порядке!\n");
} else {
    
printf ("Ошибка: %s\n"mysqli_error($link));
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

Our connection is ok!

Коментарии

This does not work with mysqlnd and is marked as wontfix: https://bugs.php.net/bug.php?id=52561
2014-09-27 03:07:05
http://php5.kiev.ua/manual/ru/mysqli.ping.html
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 ;))
2015-02-13 10:56:36
http://php5.kiev.ua/manual/ru/mysqli.ping.html
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.
2015-09-22 01:00:12
http://php5.kiev.ua/manual/ru/mysqli.ping.html

    Поддержать сайт на родительском проекте КГБ