Будь ласка, не забудьте прочитати цю відповідь нижче , де детально описано способи пом'якшення проблем, викладених тут.
Такі ж недоліки існують і в PDO, як і в будь-якому іншому інтерфейсі баз даних PHP, який підтримує стійкі з'єднання: якщо ваш скрипт несподівано припиниться посеред операцій з базою даних, наступний запит, який отримує з'єднання, що залишився, підбере там, де залишився мертвий сценарій. З'єднання утримується відкритим на рівні менеджера процесів (Apache для mod_php, поточний процес FastCGI, якщо ви використовуєте FastCGI тощо), а не на рівні PHP, і PHP не повідомляє батьківському процесу відпускати з'єднання вмирати, коли сценарій закінчується аномально.
Якщо таблиці з мертвим сценарієм заблоковані, ці таблиці залишаться заблокованими, поки з'єднання не вмирає або наступний сценарій, який отримує з'єднання, розблокує самі таблиці.
Якщо сценарій мертвого опинився в середині транзакції, він може блокувати безліч таблиць, поки не вступить таймер тупикового блоку, і навіть тоді таймер тупикового блоку може вбити новіший запит замість старого запиту, що викликає проблему.
Якщо мертвий сценарій опинився в середині транзакції, наступний сценарій, який отримує це з'єднання, також отримує стан транзакції. Дуже можливо (залежно від дизайну програми) наступний сценарій насправді ніколи не намагатиметься здійснити існуючу транзакцію, або здійснить, коли її не повинно бути, або відкотити назад, коли її не повинно бути.
Це лише верхівка айсберга. Це все може бути пом’якшене, якщо завжди намагатися очистити після брудного з'єднання з кожного запиту сценарію, але це може бути болем залежно від бази даних. Якщо ви не визначили створення підключень до бази даних як єдине, що є вузьким місцем у вашому сценарії (це означає, що ви зробили профілювання коду за допомогою xdebug та / або xhprof ), ви не повинні розглядати стійкі з'єднання як рішення чогось.
Крім того, у більшості сучасних баз даних (включаючи PostgreSQL) є свої бажані способи виконання об'єднання з'єднань, які не мають негайних недоліків, які мають звичайні стійкі з'єднання на основі PHP.
Для уточнення моменту ми використовуємо стійкі зв’язки на моєму робочому місці, але не за вибором. Ми стикалися з дивною поведінкою підключення, де початкове підключення від нашого сервера додатків до нашого сервера баз даних займало рівно три секунди, коли це повинно було зайняти частку частки секунди. Ми думаємо, що це помилка ядра. Ми відмовилися від її усунення, оскільки це сталося випадковим чином і неможливо було відтворити на вимогу, а наші аутсорсингові ІТ не мали конкретної можливості відстежити це.
Незалежно від того, коли люди на складі обробляють кілька сотень вхідних частин, і кожна частина займає три з половиною секунди замість пів секунди, ми повинні були вжити заходів, перш ніж вони викрали всіх нас і змусили їх допомогти. Таким чином, ми перевернули декілька біт у своїй домашній ERP / CRM / CMS чудовисько і пережили всі жахливі стійкі зв’язки з перших рук. Нам знадобилися тижні, щоб відстежити всі найтонші проблеми та химерну поведінку, що, здавалося б, випадково. Виявилося, що ті фатальні помилки один раз на тиждень, які наші користувачі старанно видаляли з нашого додатку, залишали заблоковані столи, покинуті транзакції та інші нещасні вибагливі стани.
Ця приказка має сенс: вона порушила речі, які ми ніколи не розраховували порушити, все в ім'я виконання. Компроміс не вартував цього, і ми з нетерпінням чекаємо того дня, коли ми зможемо перейти до нормальних з’єднань без нападів наших користувачів.