Как работают PHP-методы p * connect? - PullRequest
1 голос
/ 26 августа 2009

Насколько я понимаю, PHP-соединения p * состоят в том, что они поддерживают постоянную связь между загрузками страниц в сервис (будь то memcache, сокет и т. Д.). Но эти соединения потокобезопасны? Что происходит, когда две страницы пытаются получить доступ к одному и тому же соединению одновременно?

Ответы [ 4 ]

11 голосов
/ 26 августа 2009

В типичном развертывании Unix PHP устанавливается как модуль, работающий внутри веб-сервера apache, который, в свою очередь, настроен на отправку HTTP-запросов одному из нескольких порожденных потомков.

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

PHP работает по принципу запуска каждого запроса в чистой среде; Переменные скрипта не сохраняются между загрузками страниц. (Сравните это с mod_perl или python, где приложения часто обнаруживают незначительные ошибки из-за неожиданного похмелья состояния).

Это означает, что типичный ресурс, выделенный сценарием PHP, будь то дескриптор изображения для GD или соединение с базой данных, будет освобожден в конце запроса.

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

Введите постоянные ресурсы.

Способ, которым они работают, заключается в том, что любой данный дочерний процесс apache может поддерживать ресурс за рамками запроса, регистрируя его в «постоянном списке» ресурсов. Постоянный список не очищается в конце запроса (внутренне известный как RSHUTDOWN). Когда вы используете функцию pconnect, она ищет запись постоянного списка для заданного набора уникальных учетных данных и возвращает ее, если она существует, или устанавливает новое соединение с этими учетными данными.

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

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

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

0 голосов
/ 26 августа 2009

Вообще говоря, PHP создаст одно постоянное соединение для каждого процесса или потока, запущенного на веб-сервере. Из-за этого процесс или поток не будет иметь доступа к соединению другого процесса или потока.

Вместо этого, когда вы устанавливаете соединение с базой данных, PHP проверит, если оно уже открыто (в процессе или потоке, обрабатывающем запрос страницы), и если это так, то оно будет использовать его, иначе просто инициализирует новый.

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

0 голосов
/ 26 августа 2009

Страница руководства Постоянные соединения с базой данных может дать вам пару сведений о постоянных соединениях.

Это ничего не говорит о безопасности потоков, все же; Насколько я помню, я ни разу об этом ничего не видел, так что, полагаю, "все работает хорошо". Я предполагаю, что соединение повторно используется, только если оно еще не используется другим потоком в то же время, но это всего лишь некая (логическая) дикая догадка ...

0 голосов
/ 26 августа 2009

Вообще говоря, когда скрипт PHP запрашивает постоянное соединение, PHP будет искать его в пуле соединений с такими же параметрами соединения.

Если обнаружено, что оно НЕ используется, оно передается сценарию и возвращается в пул в конце сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...