为什么PHP sleep()阻止Postgresql查询?

时间:2018-10-23 10:01:34

标签: php postgresql sockets asynchronous sleep

从Centos 6升级到Centos 7时,我们遇到了PHP pg_send_querypg_connection_busy的问题。

Postgresql: 9.6.3 compiled from source
PHP: 5.6.16 / 7.1 compiled from source / package rpm
Linux: Centos 7

(A)没睡没问题:

$sel = "SELECT * FROM idx.idx_indeks ORDER BY indeks";
$DBconn=pg_connect("host=168.21.5.1 dbname=dbprod");
$s=pg_send_query($DBconn,$sel);
$res = pg_get_result($DBconn);

执行查询并完成脚本大约需要2 s。

(B) 添加睡眠使其运行时间更长:

$sel = "SELECT * FROM idx.idx_indeks ORDER BY indeks";
$DBconn=pg_connect("host=168.21.5.1 dbname=dbprod");
$s=pg_send_query($DBconn,$sel);

while(pg_connection_busy($DBconn)) {
        usleep(10000);
}

$res = pg_get_result($DBconn);

现在执行查询并完成脚本需要60秒钟以上的时间。 在运行php脚本期间,pg_stat_activity中的SQL查询处于活动状态,并且只要php脚本正在运行就保持活动状态。

我使用两个不同的服务器(一个使用PHP,另一个使用Postgresl)还是所有都在本地主机上设置都没关系。

在具有相同PostgreSql和PHP(A)和(B)情况的Centos 6上花费相同的时间-大约2 s。

(B.2)

但是,如果我通过套接字连接数据库,它也需要60多秒钟才能完成(!):

Linux: Centos 6


$sel = "SELECT * FROM idx.idx_indeks ORDER BY indeks";
$DBconn=pg_connect("dbname=dbprod");  // Socket connection
$s=pg_send_query($DBconn,$sel);
$res = pg_get_result($DBconn);

while(pg_connection_busy($DBconn)) {
        usleep(10000);
}

$res = pg_get_result($DBconn);

(C)

今天我发现如果我使用pg_consume_input,那么在Centos7上就没有问题。 脚本再次按照我的预期运行2 s。但是我不确定问题出在哪里。

$sel = "SELECT * FROM idx.idx_indeks ORDER BY indeks";
$DBconn=pg_connect("host=168.21.5.1 dbname=dbprod");
$s=pg_send_query($DBconn,$sel);

while(pg_connection_busy($DBconn)) {
    pg_consume_input($DBconn);
    usleep(10000);
}

$res = pg_get_result($DBconn);

我想新Centos中的套接字处理可能存在问题。似乎在php中使用sleep()会以某种方式在不同的过程中在postgresql中执行sql。

0 个答案:

没有答案