从Centos 6升级到Centos 7时,我们遇到了PHP pg_send_query
和pg_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。