PHP 8.5.0 Alpha 2 available for testing

mysqli::ping

mysqli_ping

(PHP 5, PHP 7, PHP 8)

mysqli::ping -- mysqli_pingVerifica la conexión al servidor y reconecta si ya no existe

Advertencia

Esta función está OBSOLETA a partir de PHP 8.4.0. Está fuertemente desaconsejado depender de esta función.

Descripción

Estilo orientado a objetos

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

Estilo procedimental

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

Verifica si la conexión al servidor funciona correctamente. Si ha sido cerrada y la opción global mysqli.reconnect está activada, se intenta una reconexión automática.

Nota: El parámetro php.ini mysqli.reconnect es ignorado por el controlador mysqlnd, por lo tanto las reconexiones automáticas nunca se intentan.

Esta función puede ser utilizada para que los clientes que permanecen abiertos durante mucho tiempo sin actividad puedan verificar que la conexión no ha sido cerrada por el servidor y, en caso afirmativo, realizar una reconexión automática.

Parámetros

mysql

Solo estilo procedimental: Un objeto mysqli devuelto por mysqli_connect() o mysqli_init()

Valores devueltos

Esta función retorna true en caso de éxito o false si ocurre un error.

Errores/Excepciones

Si el informe de errores de mysqli está habilitado (MYSQLI_REPORT_ERROR) y la operación solicitada falla, se genera una advertencia. Si, además, el modo está configurado como MYSQLI_REPORT_STRICT, se lanza una mysqli_sql_exception en su lugar.

Historial de cambios

Versión Descripción
8.4.0 Los métodos mysqli::ping() y mysqli_ping() están ahora obsoletos. La funcionalidad reconnect ya no está disponible desde PHP 8.2.0, lo que hace que esta función sea obsoleta.

Ejemplos

Ejemplo #1 Ejemplo con mysqli::ping()

Estilo orientado a objetos

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

/* Verificación de la conexión */
if ($mysqli->connect_errno) {
printf("Conexión fallida: %s\n", $mysqli->connect_error);
exit();
}

/* Verificación si la conexión sigue activa */
if ($mysqli->ping()) {
printf ("¡La conexión está bien!\n");
} else {
printf ("Error: %s\n", $mysqli->error);
}

/* Cierre de la conexión */
$mysqli->close();
?>

Estilo procedimental

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

/* Verificación de la conexión */
if (mysqli_connect_errno()) {
printf("Fallo en la conexión: %s\n", mysqli_connect_error());
exit();
}

/* Verificación si la conexión sigue activa */
if (mysqli_ping($link)) {
printf ("¡La conexión está bien!\n");
} else {
printf ("Error: %s\n", mysqli_error($link));
}

/* Cierre de la conexión */
mysqli_close($link);
?>

Los ejemplos anteriores mostrarán :

¡La conexión es válida!
add a note

User Contributed Notes 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:

<?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_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