Пожалуйста, не забудьте прочитать this answer below, в котором подробно описаны способы устранения проблем, описанных здесь.
Тех же недостатки существуют с использованием PDO, как с любым другим интерфейсом базы данных PHP, что делает постоянные соединения: если ваш скрипт завершается неожиданно в середине операций базы данных, следующем запрос, который получает налево через соединение подберет где мертвый сценарий прекратился. Соединение открыто на уровне диспетчера процессов (Apache для mod_php, текущий процесс FastCGI, если вы используете FastCGI и т. Д.), А не на уровне PHP, а PHP не сообщает родительскому процессу, чтобы соединение замирало, когда сценарий прерывается ненормально.
Если мертвый скрипт заблокировал таблицы, эти таблицы останутся заблокированными до тех пор, пока соединение не умрет, или следующий скрипт, который получает соединение, разблокирует сами таблицы.
Если мертвый сценарий находился в середине транзакции, которая может блокировать множество таблиц до тех пор, пока таймер блокировки не начнет работать, и даже тогда таймер блокировки может убить новый запрос вместо старого запроса, вызывающего проблема.
Если мертвый сценарий находился в середине транзакции, следующий скрипт, который получает это соединение, также получает состояние транзакции. Очень возможно (в зависимости от вашего дизайна приложения), что следующий скрипт на самом деле никогда не попытается зафиксировать существующую транзакцию или не будет зафиксирован, когда этого не должно быть, или откат, когда этого не должно быть.
Это только верхушка айсберга. Все это можно смягчить, пытаясь очистить после грязного соединения по каждому запросу сценария, но это может быть болью в зависимости от базы данных. Если вы не определили создания соединения с базой данных, как одна вещь, которая является узким местом в сценарии (это означает, что вы сделали профилирование кода с помощью xdebug и/или xhprof), вы должны не рассматривать постоянные соединения в качестве решения ни к чему ,
Кроме того, большинство современных баз данных (включая PostgreSQL) имеют свои собственные предпочтительные способы выполнения пула соединений, которые не имеют непосредственных недостатков, которые делают простые постоянные соединения на основе ванильного PHP.
Для уточнения моментов мы используем постоянные соединения на моем рабочем месте, но не по выбору. Мы столкнулись с ситуацией weird, где начальное соединение с нашего сервера приложений на нашем сервере базы данных принимало ровно три секунды, когда он должен был принять долю доли секунды. Мы считаем, что это ошибка ядра. Мы отказались от попыток устранить его, потому что это произошло случайным образом и не могло быть воспроизведено по требованию, и наши аутсорсинговые ИТ не имели конкретной возможности отслеживать его.
Независимо от того, когда люди на складе обрабатывают несколько сотен входящих частей, и каждая часть занимает три с половиной секунды вместо половины секунды, мы должны были принять меры, прежде чем они похитили нас всех и помогли нам помочь их. Таким образом, мы перевернули несколько бит в нашем самодельном оригинале ERP/CRM/CMS и испытали все ужасы постоянных соединений из первых рук. Нам потребовалось недель, чтобы отследить все тонкие небольшие проблемы и причудливое поведение, которое казалось случайным образом. Оказалось, что эти раз в неделю фатальные ошибки, которые наши пользователи усердно вытеснили из нашего приложения, оставляют заблокированные столы, заброшенные транзакции и другие неудачные неуклюжие состояния.
У этой рыдания есть точка: Это сломало вещи, которые мы никогда не ожидали сломать, все во имя исполнения. Компромисс не стоил того, и мы с нетерпением ждем того дня, когда мы сможем вернуться к нормальным соединениям без беспорядков со стороны наших пользователей.
Ничего себе, вы заплатили 1000 баллов за этот простой вопрос? – Pacerier
@Pacerier, [нет, это был кто-то еще] (http://meta.stackexchange.com/q/175402/135887). – Charles