PHP 8.5.0 Alpha 1 available for testing

pg_connection_busy

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_connection_busy Verifica si la conexión PostgreSQL está ocupada

Descripción

pg_connection_busy(PgSql\Connection $connection): bool

pg_connection_busy() determina si la conexión está ocupada. Si está ocupada, una consulta ya ha sido lanzada y está en curso. Si pg_get_result() es utilizada, será entonces bloqueada.

Parámetros

connection

An PgSql\Connection instance.

Valores devueltos

Devuelve true si la conexión está ocupada, de lo contrario false.

Historial de cambios

Versión Descripción
8.1.0 The connection parameter expects an PgSql\Connection instance now; previously, a recurso was expected.

Ejemplos

Ejemplo #1 Ejemplo con pg_connection_busy()

<?php
$dbconn
= pg_connect("dbname=publisher") or die("Conexión imposible");
$bs = pg_connection_busy($dbconn);
if (
$bs) {
echo
'La conexión está ocupada';
} else {
echo
'La conexión está libre';
}
?>

Ver también

add a note

User Contributed Notes 2 notes

up
2
VLroyrenn
6 years ago
There doesn't seem to be any documented way of using this function here, and I'm sore most people trying this are going to default to using a busy loop if there is nothing else to do while waiting (in which case pg_get_result would be better, since it just blocks until a result is ready) or a sleep loop if trying to cancel the query after a certain time.

The C documentation for libPq reccomends using PQisBusy (the C equivalent of pg_connection_busy) by waiting on a socket instead, which lets you timeout if the state doesn't change after a certain period but immediately react if it changes. If you want to cancel after a timeout, you would have something like this :

<?php
class SomeKindOfTimeoutException extends Exception { }

class
SomeKindOfSQLErrorException extends Exception { }

function
query_with_timeout($conn, $query, $timeout_seconds) {
assert(pg_get_result($conn) === false); // Ensure that nothing is running

$socket = [pg_socket($conn)];
$null = [];

$dispatch_ok = pg_send_query($conn, $query);

$still_running = pg_connection_busy($conn);

while(
$still_running) {
// https://www.postgresql.org/docs/current/libpq-async.html
// "A typical application using these functions will have a main loop that uses select() or poll() to wait for all the conditions that it must respond to."
// "One of the conditions will be input available from the server, which in terms of select() means readable data on the file descriptor identified by PQsocket."
// PQisBusy is mapped to pg_connection_busy
stream_select($socket, $null, $null, $timeout_seconds); // Will wait on that socket until that happens or the timeout is reached
$still_running = pg_connection_busy($conn); // False on timeout, true if complete

// You could keep polling like that, this just breaks and throws immediately on first loop
if ($still_running) {
$cancel_ok = pg_cancel_query($conn);
throw new
SomeKindOfTimeoutException("TIMEOUT");
}
}

$res = pg_get_result($conn);

try {
$error_msg = pg_result_error($res);
if (
$error_msg) throw new SomeKindOfSQLErrorException($error_msg);

return
pg_fetch_all($res);
} finally {
pg_free_result($res);
}
}

$conn_string = "host=localhost port=5433 dbname=postgres";
$db = pg_connect($conn_string);

query_with_timeout($db, "SELECT pg_sleep(10)", 3); // Will throw
?>
up
2
levi at alliancesoftware dot com dot au
15 years ago
pg_connection_busy() returning true does not necessarily mean that there are results waiting for pg_get_result(); it also stays true for some time after a query that causes any sort of postgres error. (See http://bugs.php.net/bug.php?id=36469)
To Top