mysqli::ping

mysqli_ping

(PHP 5, PHP 7, PHP 8)

mysqli::ping -- mysqli_pingComprueba la conexión al servidor, o trata de reconectar si se perdió la conexión

Descripción

Estilo orientado a objetos

mysqli::ping(): bool

Estilo por procedimientos

mysqli_ping(mysqli $link): bool

Comprueba si la conexión al servidor funciona. Si se ha perdido, y la opción global mysqli.reconnect está habilitada, se intenta realizar una reconexión automática.

Esta función la pueden utilizar clientes que permanecen inactivos por mucho tiempo para comprobar si el servidor ha cerrado la conexión y reconectar si fuera necesario.

Parámetros

link

Sólo estilo por procediminetos: Un identificador de enlace devuelto por mysqli_connect() o mysqli_init()

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de mysqli::ping()

Estilo orientado a objetos

<?php
$mysqli
= new mysqli("localhost", "mi_usuario", "mi_contraseña", "world");

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

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

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

Estilo por procedimientos

<?php
$enlace
= mysqli_connect("localhost", "mi_usuario", "mi_contraseña", "world");

/* comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Conexión fallida: %s\n", mysqli_connect_error());
exit();
}

/* comprobar si el servidor sigue funcionando */
if (mysqli_ping($enlace)) {
printf ("¡La conexión está bien!\n");
} else {
printf ("Error: %s\n", mysqli_error($enlace));
}

/* cerrar la conexión */
mysqli_close($enlace);
?>

El resultado de los ejemplos sería:

¡La conexión está bien!
add a note add a note

User Contributed Notes 3 notes

up
13
jay at grooveshark dot com
9 years ago
This does not work with mysqlnd and is marked as wontfix: https://bugs.php.net/bug.php?id=52561
up
4
snooops84 at googlemail dot com
9 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 ;))
up
2
root at jusme dot org
8 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.
To Top