PHP 8.1.28 Released!

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

Descrição

Estilo orientado a objetos

public mysqli::ping(): bool

Estilo procedural

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.

Exemplos

Exemplo #1 mysqli::ping() exemplo

Estilo orientado a objetos

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

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

/* verifique 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", "my_user", "my_password", "world");

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

/* verifique 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!
add a note

User Contributed Notes 3 notes

up
14
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
4
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