PHP 8.4.2 Released!

pg_get_result

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

pg_get_result Получает результат асинхронного запроса

Описание

pg_get_result(PgSql\Connection $connection): PgSql\Result|false

Функция pg_get_result() получает экземпляр класса PgSql\Result из асинхронного запроса, который выполняют функциями pg_send_query(), pg_send_query_params() или pg_send_execute().

Функция pg_send_query() и другие функции, которые отправляют асинхронные запросы, умеет отправлять на сервер серию запросов один за другим, а функция pg_get_result() получает результаты каждого запроса по очереди.

Список параметров

connection

Экземпляр класса PgSql\Connection.

Возвращаемые значения

Функция возвращает экземпляр класса PgSql\Result, или false, если доступных результатов не осталось.

Список изменений

Версия Описание
8.1.0 Функция возвращает экземпляр класса PgSql\Result; раньше функция возвращала ресурс (resource).
8.1.0 Параметр connection теперь ожидает экземпляр класса PgSql\Connection; раньше параметр ожидал ресурс (resource).

Примеры

Пример #1 Пример получения результата асинхронного запроса функцией pg_get_result()

<?php

$dbconn
= pg_connect("dbname=publisher") or die("Невозможно соединиться с сервером");

if (!
pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "SELECT * FROM authors; SELECT count(*) FROM authors;");
}

$res1 = pg_get_result($dbconn);
echo
"Первый вызов функции pg_get_result(): $res1\n";
$rows1 = pg_num_rows($res1);
echo
"$res1 содержит $rows1 записей\n\n";

$res2 = pg_get_result($dbconn);
echo
"Второй вызов функции pg_get_result(): $res2\n";
$rows2 = pg_num_rows($res2);
echo
"$res2 содержит $rows2 записей\n";

?>

Результат выполнения приведённого примера:

Первый вызов функции pg_get_result(): Resource id #3
Resource id #3 содержит 3 записей

Второй вызов функции pg_get_result(): Resource id #4
Resource id #4 содержит 1 записей

Смотрите также

  • pg_send_query() - Отправляет асинхронный запрос

Добавить

Примечания пользователей 4 notes

up
5
william at 25thandClement dot com
19 years ago
There is no way to poll/wait for a notification to come in. You either have to enter a busy loop or sleep. Both options are horrible. It would be nice for PHP to provide access to PQsocket so one could select() on the socket connection. This is how it's done from C or Perl.
up
0
Ondej Bouda
9 years ago
It might seem that after calling pg_get_result() upon sending just a single query, the connection will not be busy. The correct way is, though, to call extra pg_get_result() in a loop until it returns false [1].

<?php
$conn
= pg_connect('...', PGSQL_CONNECT_FORCE_NEW);
for (
$i = 0; $i < 10000; $i++) {
$query = 'erroneous query';
if (
pg_connection_busy($conn)) {
fprintf(STDERR, "Connection is busy\n");
exit(
1);
}
pg_send_query($conn, $query);
$res = pg_get_result($conn);
if (
$res === false) {
fprintf(STDERR, "A result was expected\n");
exit(
1);
}

/* The following does not seem necessary for good queries, but is vital for erroneous queries.
Commenting the loop out leads to this script fail with the "Connection is busy" error. */
while (pg_get_result($conn));

// result processing...
}
?>

See http://www.postgresql.org/message-id/flat/gtitqq$26l3$1@news.hub.org#gtitqq$26l3$1@news.hub.org and https://bugs.php.net/bug.php?id=52750 for detailed information.

[1] Or, even better, use an asynchronous connection since PHP 5.6.
up
0
gullevek at gullevek dot org
11 years ago
To have a a simple wait output with async queries you can use the pg_connection_busy command:

<?php
$dbh
= pg_connect("host=XXX user=XXX password=XXX dbname=XXX");
if (!
$dbh)
{
print
"Failed to connect";
exit;
}

$query = "SELECT pg_sleep(10)";
if (!
pg_connection_busy($dbh))
{
$sent = pg_send_query($dbh, $query);
print
"Sent query, waiting: ";
while (
pg_connection_busy($dbh)
{
print
".";
flush();
}
$res = pg_get_result($dbh);
print
"<br>"; // or \n
print "Result is: $res";
}

pg_close($dbh);
?>
up
-5
Marko Tiikkaja
16 years ago
william at 25thandClement dot com said: "There is no way to poll/wait for a notification to come in. .."
Yes, there is. If there is a query in progress, pg_get_result() will block and return the result of that query when it's complete.
To Top