PHP 8.4.1 Released!

pg_connection_busy

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

pg_connection_busy Get connection is busy or not

Опис

pg_connection_busy(PgSql\Connection $connection): bool

pg_connection_busy() determines whether or not a connection is busy. If it is busy, a previous query is still executing. If pg_get_result() is used on the connection, it will be blocked.

Параметри

connection

Примірник PgSql\Connection.

Значення, що повертаються

Returns true if the connection is busy, false otherwise.

Журнал змін

Версія Опис
8.1.0 Тепер параметр connection має бути примірником PgSql\Connection. Раніше очікувався resource.

Приклади

Приклад #1 pg_connection_busy() example

<?php
$dbconn
= pg_connect("dbname=publisher") or die("Could not connect");
$bs = pg_connection_busy($dbconn);
if (
$bs) {
echo
'connection is busy';
} else {
echo
'connection is not busy';
}
?>

Прогляньте також

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