ConFoo 2025

pg_connection_busy

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

pg_connection_busy Permite saber si la conexión esta ocupada o no

Descripción

pg_connection_busy(resource $connection): bool

pg_connection_busy() determina si una conexión está ocupada. Si está ocupada, una consulta anterior todavía se está ejecutando. Si pg_get_result() es usada en la conexión, esta sera bloqueada.

Parámetros

connection

Recurso de conexión de base de datos PostgreSQL.

Valores devueltos

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

Ejemplos

Ejemplo #1 Ejemplo de pg_connection_busy()

<?php
$dbconn
= pg_connect("dbname=publisher") or die("No se ha podido conectar");
$bs = pg_connection_busy($dbconn);
if (
$bs) {
echo
'la conexión está ocupada';
} else {
echo
'la conexión no está ocupada';
}
?>

Ver también

add a note

User Contributed Notes 2 notes

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)
up
1
VLroyrenn
5 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
?>
To Top