mysqli::ping

mysqli_ping

(PHP 5, PHP 7, PHP 8)

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

Внимание

Функция УСТАРЕЛА с PHP 8.4.0. Пользоваться функцией настоятельно не рекомендуют.

Описание

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

#[\Deprecated]
public mysqli::ping(): bool

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

#[\Deprecated]
mysqli_ping(mysqli $mysql): bool

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

Замечание: Драйвер mysqlnd игнорирует директиву mysqli.reconnect файла php.ini, поэтому не переподключается автоматически.

Функцией пользуются клиенты, которые долго простаивали, чтобы проверить, не закрыл ли сервер соединение, и требуется ли переподключение.

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

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect() или функция mysqli_init().

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

Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.

Ошибки

Если уведомления об ошибках mysqli включены (MYSQLI_REPORT_ERROR) и запрошенная операция не удалась, выдаётся предупреждение. Если, кроме того, установлен режим MYSQLI_REPORT_STRICT, вместо этого будет выброшено исключение mysqli_sql_exception.

Список изменений

Версия Описание
8.4.0 Метод mysqli::ping() и функция mysqli_ping() устарели. Функция reconnect была недоступна с PHP 8.2.0, что делает эту функцию устаревшей.

Примеры

Пример #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!
Добавить

Примечания пользователей 3 notes

up
13
jay at grooveshark dot com
10 years ago
This does not work with mysqlnd and is marked as wontfix: https://bugs.php.net/bug.php?id=52561
up
5
root at jusme dot org
9 years ago
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:<?phpclass 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_TIMEOUT, 1);        @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_HOST, DB_USER, DB_PASS, DB_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.
up
4
snooops84 at googlemail dot com
10 years ago
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 ;))
To Top