Обязательно прочитайте этот ответ ниже , в котором подробно описаны способы решения проблем, изложенных здесь.
При использовании PDO существуют те же недостатки, что и с любым другим интерфейсом базы данных PHP, который выполняет постоянные подключения: если ваш сценарий неожиданно завершается в середине операций с базой данных, следующий запрос, который получает оставленное соединение, будет обнаружен там, где оставался мертвый сценарий. выкл. Соединение поддерживается открытым на уровне диспетчера процессов (Apache для mod_php, текущий процесс FastCGI, если вы используете FastCGI и т. Д.), А не на уровне PHP, и PHP не сообщает родительскому процессу, чтобы соединение умирало, когда скрипт завершается ненормально.
Если мертвый сценарий заблокировал таблицы, эти таблицы будут оставаться заблокированными до тех пор, пока подключение не прекратится или следующий сценарий, который получает подключение, разблокирует сами таблицы.
Если мертвый сценарий находился в середине транзакции, он может блокировать множество таблиц до тех пор, пока не сработает таймер взаимоблокировки, и даже в этом случае таймер взаимоблокировки может уничтожить более новый запрос вместо более старого запроса, вызывающего проблему. .
Если мертвый скрипт находился в середине транзакции, следующий скрипт, который получает это соединение, также получает состояние транзакции. Вполне возможно (в зависимости от дизайна вашего приложения), что следующий скрипт может даже не пытаться зафиксировать существующую транзакцию, или выполнит фиксацию, когда она не должна иметь, или откатится, когда она не должна была.
Это только вершина айсберга. Все это может быть смягчено до некоторой степени, всегда пытаясь очистить после грязного соединения при каждом запросе скрипта, но это может быть проблемой в зависимости от базы данных. Если вы не определили создание соединений с базой данных как единственное, что является узким местом в вашем скрипте (это означает, что вы выполнили профилирование кода, используя xdebug и / или xhprof ), вы должны не рассматривать постоянные соединения как решение чего-либо.
Более того, большинство современных баз данных (включая PostgreSQL) имеют свои собственные предпочтительные способы выполнения пулов соединений, которые не имеют непосредственных недостатков, которые имеют обычные постоянные соединения на основе PHP.
Чтобы прояснить ситуацию, мы используем постоянные соединения на моем рабочем месте, но не по своему выбору. Мы сталкивались с странным поведением соединения, когда первоначальное подключение от нашего сервера приложений к нашему серверу базы данных занимало ровно три секунды, тогда как это должно было занять доли доли секунды , Мы думаем, что это ошибка ядра. Мы отказались от попыток устранения неполадок, потому что это происходило случайным образом и не могло быть воспроизведено по требованию, а наши внешние ИТ не имели конкретной возможности отследить это.
Независимо от того, когда люди на складе обрабатывают несколько сотен входящих деталей, и каждая часть занимает три с половиной секунды вместо полсекунды, нам пришлось принять меры, прежде чем они нас всех похитили и заставили нас помочь им , Итак, мы включили несколько кусочков в наше собственное чудовище ERP / CRM / CMS и испытали все ужасы постоянных соединений из первых рук. Нам потребовалось недель , чтобы отследить все тонкие небольшие проблемы и странное поведение, которые происходили, казалось бы, наугад. Оказалось, что из-за раз в неделю фатальные ошибки, которые наши пользователи старательно выдавливали из нашего приложения, оставляли заблокированные таблицы, отмененные транзакции и другие неудачные состояния вины.
У этой истории есть одна вещь: Она сломала вещи, которые мы никогда не ожидали сломать, во имя исполнения. Компромисс не стоил этого, и мы с нетерпением ждем дня мы можем вернуться к обычным соединениям без беспорядков от наших пользователей.