Каковы правила / логика постоянного управления соединениями при использовании PDO?
Веб сервер
Сервер БД
Непостоянные соединения
<?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? ?>
Постоянное подключение
<?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 ?>
Я посещаю страницу, и webuser
получает SID=1
Мой коллега посещает страницу, а webuser
получает дополнительный SID=2
<- прополоскать, повторить и увеличить SID для новых компьютеров, посещающих эту страницу
Не должен ли новый посетитель повторно использовать SID=1
?
Приветствуются все ответы, предложения, запросы на альтернативное тестирование, ссылки на материалы для чтения.
У меня RTFM'ed какое-то время, и Googling только создавал скудные Advantages of Persistent vs. Non-persistent
непостоянных блогов.
У Apache есть один родительский процесс. Этот процесс создает дочерние процессы, которые будут обрабатывать любые запросы, поступающие на веб-сервер. Начальное количество дочерних процессов, запущенных при запуске веб-сервера, настраивается директивой StartServers
в конфигурации apache. Число увеличивается по мере необходимости с увеличением количества запросов, попадающих на веб-сервер, до ServerLimit
.
Если 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 выглядит таким смешным. Даже тот же пользователь / посетитель может создать второй или даже третий экземпляр. То же самое произошло со мной на моей локальной машине, проверяя производительность моих запросов.
Это не о чем беспокоиться, потому что эти экземпляры рано или поздно истекают, точный тайм-аут зависит от конфигурации вашего сервера.
Почему это происходит? Если текущий экземпляр занят, то будет создан новый экземпляр, а старший будет раньше или позже. По крайней мере, это кажется мне логичным.