PHP Conference Japan 2024

mysqli::ping

mysqli_ping

(PHP 5, PHP 7, PHP 8)

mysqli::ping -- mysqli_pingPingt eine Serververbindung an oder versucht eine neue Verbindung aufzubauen, wenn die Verbindung unterbrochen wurde

Warnung

Diese Funktion ist seit PHP 8.4.0 als DEPRECATED (veraltet) markiert. Von der Verwendung dieser Funktion wird dringend abgeraten.

Beschreibung

Objektorientierter Stil

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

Prozeduraler Stil

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

Überprüft, ob die Verbindung zum Server funktioniert. Wenn sie unterbrochen wurde und die globale Option mysqli.reconnect aktiviert ist, wird automatisch versucht, eine neue Verbindung herzustellen.

Hinweis: Die php.ini-Einstellung mysqli.reconnect wird vom mysqlnd-Treiber ignoriert, so dass nie automatisch versucht wird, eine neue Verbindung herzustellen.

Diese Funktion kann von Clients verwendet werden, die längere Zeit untätig sind, um zu überprüfen, ob der Server die Verbindung getrennt hat, und sich gegebenenfalls neu zu verbinden.

Parameter-Liste

mysql

Nur bei prozeduralem Aufruf: ein von mysqli_connect() oder mysqli_init() zurückgegebenes mysqli-Objekt.

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben.

Fehler/Exceptions

If mysqli error reporting is enabled (MYSQLI_REPORT_ERROR) and the requested operation fails, a warning is generated. If, in addition, the mode is set to MYSQLI_REPORT_STRICT, a mysqli_sql_exception is thrown instead.

Changelog

Version Beschreibung
8.4.0 Sowohl mysqli::ping() als auch mysqli_ping() sind nun veraltet. Die Funktionalität reconnect ist seit PHP 8.2.0 nicht mehr verfügbar, wodurch diese Funktion überflüssig wurde.

Beispiele

Beispiel #1 mysqli::ping()-Beispiel

Objektorientierter Stil

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

/* Verbindung überprüfen */
if ($mysqli->connect_errno) {
printf("Verbindung fehlgeschlagen: %s\n", $mysqli->connect_error);
exit();
}

/* Überprüfen, ob der Server läuft */
if ($mysqli->ping()) {
printf ("Unsere Verbindung ist OK!\n");
} else {
printf ("Fehler: %s\n", $mysqli->error);
}

/* Verbindung schließen */
$mysqli->close();
?>

Prozeduraler Stil

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

/* Verbindung überprüfen */
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}

/* Überprüfen, ob der Server läuft */
if (mysqli_ping($link)) {
printf ("Unsere Verbindung ist OK!\n");
} else {
printf ("Fehler: %s\n", mysqli_error($link));
}

/* Verbindung schließen */
mysqli_close($link);
?>

Die obigen Bespiele erzeugen folgende Ausgabe:

Unsere Verbindung ist OK!
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
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 ;))
To Top