Почему PHP sleep () блокирует запрос Postgresql? - PullRequest
0 голосов
/ 23 октября 2018

Мы столкнулись с проблемой 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 в другом процессе.

...