2016-07-06 3 views
0

У меня есть приложение Apache/PHP на одном сервере и база данных PostgreSQL на втором сервере. Они настроены для подключения через SSL. Все работает, за исключением того, что хотя в сценарии есть $db->setAttribute(PDO::ATTR_PERSISTENT, true);, TCP-соединения всегда закрыты. PHP.INI имеет pgsql.allow_persistent = Onpgsql.auto_reset_persistent = Offpgsql.max_persistent = 30 и pgsql.max_links = 30. Использование sudo netstat -nap Я вижу, что между двумя серверами нет подключений ESTABLISHED. Что еще мне нужно сделать, чтобы открыть соединения? Новые затраты на подключение составляют 10-12 мс за запрос.php postgresql постоянные соединения всегда закрываются

+0

Используйте пул соединений, например pgBouncer. Всегда. –

ответ

0

Я нашел эту записку справедливый путь вниз один из страниц PHP Manual:

Если вы хотите использовать постоянные соединения, вы должны установить PDO :: ATTR_PERSISTENT в массиве параметров драйвера передается в PDO конструктор. Если этот атрибут установлен с помощью PDO :: setAttribute() после создания объекта , драйвер не будет использовать постоянные соединения .

Вот где я поступил не так. Я использовал это:

$host = explode('.',$_SERVER['SERVER_NAME']); 
$db = new PDO($host[0]); 
$db->setAttribute(PDO::ATTR_PERSISTENT, true); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

Когда я должен был сделать это:

$host = explode('.', $_SERVER['SERVER_NAME']); 
$db = new PDO($host[0],null,null,array(PDO::ATTR_PERSISTENT=>true, 
     PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 
     PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC)); 

Серии DSN находится в pdo.ini файла. Нулевой пользователь и пароль, к счастью, игнорируются, иначе это тоже не сработает. Теперь new PDO принимает 0,02 мс вместо 10 мс.

Смежные вопросы