无法轮询/等待通知到来。您要么必须进入繁忙循环,要么睡眠。这两种选择都很糟糕。如果 PHP 能提供对 PQsocket 的访问,这样就可以在套接字连接上 select(),那将很不错。这是从 C 或 Perl 中完成的方式。
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_get_result — 获取异步查询结果
pg_get_result() 从由 pg_send_query()、pg_send_query_params() 或 pg_send_execute() 执行的异步查询中获取一个 PgSql\Result 实例。
pg_send_query() 和其他异步查询函数可以将多个查询发送到 PostgreSQL 服务器,而 pg_get_result() 用于逐个获取每个查询的结果。
一个 PgSql\Result 实例,或者如果不再有结果可用则为 false
。
版本 | 描述 |
---|---|
8.1.0 | 现在返回一个 PgSql\Result 实例;以前,返回的是一个 资源。 |
8.1.0 | connection 参数现在期望一个 PgSql\Connection 实例;以前,期望的是一个 资源。 |
示例 #1 pg_get_result() 示例
<?php
$dbconn = pg_connect("dbname=publisher") or die("Could not connect");
if (!pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from authors; select count(*) from authors;");
}
$res1 = pg_get_result($dbconn);
echo "First call to pg_get_result(): $res1\n";
$rows1 = pg_num_rows($res1);
echo "$res1 has $rows1 records\n\n";
$res2 = pg_get_result($dbconn);
echo "Second call to pg_get_result(): $res2\n";
$rows2 = pg_num_rows($res2);
echo "$res2 has $rows2 records\n";
?>
上面的示例将输出
First call to pg_get_result(): Resource id #3 Resource id #3 has 3 records Second call to pg_get_result(): Resource id #4 Resource id #4 has 1 records
无法轮询/等待通知到来。您要么必须进入繁忙循环,要么睡眠。这两种选择都很糟糕。如果 PHP 能提供对 PQsocket 的访问,这样就可以在套接字连接上 select(),那将很不错。这是从 C 或 Perl 中完成的方式。
在发送单个查询后调用 pg_get_result() 之后,连接似乎不再繁忙。但是,正确的方法是在循环中调用额外的 pg_get_result(),直到它返回 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);
}
/* 对于好的查询,以下似乎没有必要,但对于错误的查询至关重要。
有关详细信息,请参阅 https://postgresql.ac.cn/message-id/flat/[email protected]#[email protected] 和 https://bugs.php.net/bug.php?id=52750。
[1] 或者,更重要的是,从 PHP 5.6 开始使用异步连接。
要使用异步查询获得简单的等待输出,可以使用 pg_connection_busy 命令
<?php
$dbh = pg_connect("host=XXX user=XXX password=XXX dbname=XXX");
if (!$dbh)
{
print "连接失败";
exit;
}
$query = "SELECT pg_sleep(10)";
if (!pg_connection_busy($dbh))
{
$sent = pg_send_query($dbh, $query);
print "已发送查询,等待中: ";
while (pg_connection_busy($dbh)
{
print ".";
flush();
}
$res = pg_get_result($dbh);
print "<br>"; // 或者 \n
print "结果是: $res";
}
pg_close($dbh);
?>
william 在 25thandClement dot com 说: "没有办法轮询/等待通知到来。.."
是的,有办法。如果有一个查询正在进行,pg_get_result() 将阻塞并返回该查询完成后的结果。