Полностью понять PDO ATTR_PERSISTENT

Вопрос:

Каковы правила / логика постоянного управления соединениями при использовании PDO?


Окружающая среда:

Веб сервер

  • Windows 7 x64
  • Двухъядерный процессор с 16 ГБ оперативной памяти
  • Apache 2.2.17
  • PHP 5.3.5
  • Подключение по строке DSN с IP-адресом, портом, именем службы и т. Д.
  • Нет ODBC для подключения DB (пытались создать его на 2 часа, спасибо Oracle!)

Сервер БД

  • Oracle 10g на Linux
  • Многоядерный с 4 ГБ оперативной памяти
  • Имя пользователя, специально созданное для моего веб-приложения (да, это подделка)
    • Пользователь: webuser

Мое понимание / наблюдения:

Непостоянные соединения

<?php // Open a new connection // Session created in Oracle $dbh = new PDO('DSN', 'webuser', 'password'); // webuser is active in v$session with a SID=1 $dbh = NULL; // webuser removed from v$session // Manually calling $dbh = NULL; will remove the session from v$session // OR // Wait for script EOL so a kill-session command is sent to Oracle? ?> 
  • Сценарий надежно занимает ~ .09 секунд для выполнения с накладными расходами и т. Д. …

Постоянное подключение

 <?php // Open a new connection and make it persistent // Session created in Oracle // Is Apache maintaining some sort of keep-alive with Oracle here? // because I thought php.exe is only alive for the duration of the script $dbh = new PDO('DSN', 'webuser', 'password', array(PDO::ATTR_PERSISTENT => TRUE)); // webuser is active in v$session with a SID=1 $dbh = NULL; // webuser is still active in v$session with a SID=1 $dbh = new PDO('DSN', 'webuser', 'password', array(PDO::ATTR_PERSISTENT => TRUE)); // webuser is still active in v$session with a SID=1 // Manually calling $dbh = NULL; does not kill session // OR // Script EOL does not kill session // ^^ this is good, just as expected ?> 
  • Скрипт занимает ~ .12 секунд, чтобы выполнить при первом посещении с помощью накладных расходов на инфраструктуру и т. Д. …
  • Выполнение субсеквенции занимает ~ .04

Проблема:

Я посещаю страницу, и webuser получает SID=1

Мой коллега посещает страницу, а webuser получает дополнительный SID=2 <- прополоскать, повторить и увеличить SID для новых компьютеров, посещающих эту страницу

Не должен ли новый посетитель повторно использовать SID=1 ?


Приветствуются все ответы, предложения, запросы на альтернативное тестирование, ссылки на материалы для чтения.

У меня RTFM'ed какое-то время, и Googling только создавал скудные Advantages of Persistent vs. Non-persistent непостоянных блогов.

    Аппахинская точка зрения

    У Apache есть один родительский процесс. Этот процесс создает дочерние процессы, которые будут обрабатывать любые запросы, поступающие на веб-сервер. Начальное количество дочерних процессов, запущенных при запуске веб-сервера, настраивается директивой StartServers в конфигурации apache. Число увеличивается по мере необходимости с увеличением количества запросов, попадающих на веб-сервер, до ServerLimit .

    PHP и постоянные соединения

    Если PHP (работает как mod_php, поскольку CGI все ресурсы освобождены в конце выполнения скрипта), теперь говорят, чтобы установить постоянное соединение с базой данных для запроса, это соединение сохраняется даже после завершения скрипта. Соединение, которое теперь выполняется, представляет собой соединение между дочерним процессом apache, с которым был обработан запрос, и сервером базы данных, и может быть повторно использован любым запросом, который обрабатывается этим точным дочерним процессом.

    Если по какой-либо причине (не спрашивайте меня, почему именно) дочерний процесс занят дольше, чем фактический запрос, и приходит другой запрос, родительский процесс apache перенаправляет этот запрос на (новый) дочерний процесс, который не может быть установлен подключение к базе данных до этого времени. Если это происходит во время выполнения скрипта, он вызывает SID, как вы это заметили. Теперь есть два соединения для двух разных дочерних процессов apache.

    Имейте в виду, что…

    Важно знать, что это также может вызвать массу проблем. Если существует бесконечный цикл или прерванная транзакция или какая-либо другая может быть даже непредсказуемой ошибкой во время выполнения сценария, соединение блокируется и не может быть повторно использовано. Также может случиться, что все доступные соединения базы данных используются, но есть еще один дочерний процесс сервера Apache, пытающийся получить доступ к базе данных. Этот процесс блокируется до тех пор, пока соединение не будет освобождено базой данных или apache (тайм-аут или добровольно по окончании). Дополнительная информация по этой теме на этой странице: http://www.php.net/manual/en/features.persistent-connections.php

    Надеюсь, что у меня есть все, что мы обсудили в нашей беседе с комментарием, и правильно ничего не забыл. Если да, пожалуйста, оставьте мне подсказку, и я добавлю. 🙂

    Редактировать:

    Я только что закончил читать статью @MonkeyZeus, упомянутую в этом комментарии . Он описывает процесс, который я обобщил выше, и предоставляет полезную информацию о том, как оптимизировать ваш сервер Apache для лучшей работы вместе с постоянными соединениями. Однако он может использоваться с бэкэндами базы данных oracle. Вы должны посмотреть: http://www.oracle.com/technetwork/articles/coggeshall-persist-084844.html

    PDO выглядит таким смешным. Даже тот же пользователь / посетитель может создать второй или даже третий экземпляр. То же самое произошло со мной на моей локальной машине, проверяя производительность моих запросов.

    Это не о чем беспокоиться, потому что эти экземпляры рано или поздно истекают, точный тайм-аут зависит от конфигурации вашего сервера.

    Почему это происходит? Если текущий экземпляр занят, то будет создан новый экземпляр, а старший будет раньше или позже. По крайней мере, это кажется мне логичным.