PHP Conference Fukuoka 2025

mysqli::ping

mysqli_ping

(PHP 5, PHP 7, PHP 8)

mysqli::ping -- mysqli_pingFaz ping em uma conexão de servidor ou tenta reconectar se a conexão cair

Aviso

Esta função foi DESCONTINUADA a partir do PHP 8.4.0. O uso desta função é fortemente desencorajado.

Descrição

Estilo orientado a objetos

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

Estilo procedural

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

Verifica se a conexão com o servidor está funcionando. Se ele estiver inativo e a opção global mysqli.reconnect estiver habilitada, uma reconexão automática será tentada.

Nota: A configuração mysqli.reconnect do php.ini é ignorada pelo driver mysqlnd, então a reconexão automática nunca é tentada.

Esta função pode ser utilizada por clientes que ficam muito tempo ociosos, para verificar se o servidor encerrou a conexão e reconectar se necessário.

Parâmetros

mysql

Somente no estilo procedural: Um objeto mysqli retornado por mysqli_connect() ou mysqli_init()

Valor Retornado

Retorna true em caso de sucesso ou false em caso de falha.

Erros/Exceções

Se o relatório de erros da extensão mysqli estiver habilitado (MYSQLI_REPORT_ERROR) e a operação solicitada falhar, um aviso será gerado. Se, além disso, o modo for definido como MYSQLI_REPORT_STRICT, uma exceção mysqli_sql_exception será lançada em vez do aviso.

Registro de Alterações

Versão Descrição
8.4.0 O método mysqli::ping() e a função mysqli_ping() foram descontinuados. O recurso de reconnect (reconexão) não está disponível a partir do PHP 8.2.0, tornando esta função obsoleta.

Exemplos

Exemplo #1 Exemplo de mysqli::ping()

Estilo orientado a objetos

<?php
$mysqli
= new mysqli("localhost", "meu_usuario", "minha_senha", "mundo");

/* verifica a conexão */
if ($mysqli->connect_errno) {
printf("Falha na conexão: %s\n", $mysqli->connect_error);
exit();
}

/* verifica se o servidor está ativo */
if ($mysqli->ping()) {
printf ("Nossa conexão está ok!\n");
} else {
printf ("Erro: %s\n", $mysqli->error);
}

/* encerra a conexão */
$mysqli->close();
?>

Estilo procedural

<?php
$link
= mysqli_connect("localhost", "meu_usuario", "minha_senha", "mundo");

/* verifica a conexão */
if (mysqli_connect_errno()) {
printf("Falha na conexão: %s\n", mysqli_connect_error());
exit();
}

/* verifica se o servidor está ativo */
if (mysqli_ping($link)) {
printf ("Nossa conexão está ok!\n");
} else {
printf ("Erro: %s\n", mysqli_error($link));
}

/* encerra a conexão */
mysqli_close($link);
?>

Os exemplos acima produzirão:

Nossa conexão está ok!
adicionar nota

Notas de Usuários 3 notes

up
13
jay at grooveshark dot com
11 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
10 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