Параметр соединения TCP Keep-Alive PDO

Имеет ли PHP PDO (или его значение? Драйвер PostgreSQL) иметь опцию конфигурации соединения для включения проверки активности TCP как JDBC?

У меня возникла проблема, когда мы устанавливаем соединение через NAT, который сбрасывает соединения через 5 минут (я не могу это изменить), а запрос, который мы выполняем на внешнем экземпляре Postgres, выполняется более 5 минут в результате чего наш клиент никогда не получит ответ от экземпляра Postgres и в конечном итоге истечет время ожидания.

1

Решение

Драйвер PDO PostgreSQL построен поверх клиентской библиотеки libpq. Драйвер позволяет передавать определенные параметры подключения libpq в DSN в виде пар ключ / значение, среди которых параметры поддержки активности TCP.

От PostgreSQL док:

поддержка активность

Управляет использованием клиентских TCP-сообщений на стороне клиента. Значение по умолчанию равно 1, что означает, что вкл., Но вы можете изменить это значение на 0, что означает отключение, если
Keepalive не нужны. Этот параметр игнорируется для соединений
сделано через сокет Unix-домена.

keepalives_idle

Контролирует количество секунд бездействия, по истечении которых TCP должен отправить сообщение поддержки активности на сервер. Значение ноль использует
система по умолчанию. Этот параметр игнорируется для соединений через
сокет Unix-домена или если keepalive отключены. Это только
поддерживается в системах, где сокет TCP_KEEPIDLE или TCP_KEEPALIVE
опция доступна и на Windows; в других системах он не имеет
эффект.

keepalives_interval

Определяет количество секунд, по истечении которых сообщение подтверждения активности TCP, которое не было подтверждено сервером, должно быть передано повторно.
значение ноль использует системное значение по умолчанию. Этот параметр игнорируется для
соединения, сделанные через сокет домена Unix, или если keepalive
отключен. Он поддерживается только в системах, где TCP_KEEPINTVL
опция сокета доступна и в Windows; в других системах
нет эффекта.

Пример:

<?
$db = new PDO('pgsql:dbname=mydb;host=localhost;user=myuser;password=mypass;keepalives_idle=60');
?>
3

Другие решения

Вы можете обновить время активности ядра:

echo 250 > /proc/sys/net/ipv4/tcp_keepalive_time

(кредит Крис Меррик)

2

По вопросам рекламы [email protected]