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