Мы столкнулись с проблемой PHP pg_send_query
и pg_connection_busy
при обновлении с Centos 6 до Centos 7.
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 с.
(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 запрос SQL в pg_stat_activity
имеет статус активный и остается активным, пока выполняется сценарий php.
Не имеет значения, работаю ли я на двух разных серверах (один с PHPи второй с Postgresl) или если все настроено на локальном хосте.
На Centos 6 с теми же случаями PostgreSql и PHP (A) и (B) занимает одно и то же время - около 2 с.
(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 с, как я ожидаю.Но я не уверен, где проблема.
$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.Похоже, что использование sleep () в блоках php каким-то образом выполняет sql в postgresql в другом процессе.