ここで概説されている問題を軽減する方法の詳細については、以下の回答を必ずお読みください。
PDOを使用すると、永続的な接続を行う他のPHPデータベースインターフェースと同じ欠点が存在します。データベース操作の途中でスクリプトが予期せず終了した場合、残った接続を取得する次のリクエストは、デッドスクリプトが中断したところから再開されます。接続は、PHPレベルではなく、プロセスマネージャーレベル(Apache for mod_php、FastCGIを使用している場合は現在のFastCGIプロセスなど)で開いたままであり、PHPは親プロセスに接続の終了を通知しません。スクリプトは異常終了します。
デッドスクリプトがテーブルをロックした場合、それらのテーブルは、接続が停止するか、接続を取得する次のスクリプトがテーブル自体をロック解除するまでロックされたままになります。
デッドスクリプトがトランザクションの途中にあった場合、デッドロックタイマーが作動するまで多数のテーブルがブロックされる可能性があり、それでも、デッドロックタイマーは、問題の原因となっている古いリクエストではなく、新しいリクエストを強制終了できます。
デッドスクリプトがトランザクションの途中であった場合、その接続を取得する次のスクリプトもトランザクション状態を取得します。(アプリケーションの設計によっては)次のスクリプトが実際に既存のトランザクションをコミットしようとしない場合や、必要ないときにコミットしたり、必要ないときにロールバックしたりする可能性が非常に高くなります。
これは氷山の一角にすぎません。すべてのスクリプトリクエストでダーティ接続の後に常にクリーンアップを試行することにより、ある程度はすべて軽減できますが、データベースによっては、これが面倒な場合があります。あなたは、データベース接続の作成特定していない限りボトルネックになっている一つのこと、あなたのスクリプト内を(あなたが使用してプロファイリングコードやったこの手段Xdebugを、および/またはxhprofは)、あなたがすべきではない何の解決策として、持続的な接続を考慮してください。
さらに、ほとんどの最新のデータベース(PostgreSQLを含む)には、接続プールを実行する独自の方法があり、単純なPHPベースの永続的な接続のような直接的な欠点はありません。
ポイントを明確にするために、私たちは職場では持続的な接続を使用していますが、選択ではありません。奇妙な接続動作が発生しました。アプリケーションサーバーからデータベースサーバーへの最初の接続にちょうど 3秒かかっていました。カーネルのバグだと思います。ランダムに発生し、オンデマンドで再現できなかったため、トラブルシューティングの試行をあきらめました。アウトソーシングされたITには、それを追跡する具体的な能力がありませんでした。
いずれにせよ、倉庫のスタッフが数百個の入荷部品を処理していて、各部品が0.5秒ではなく3.5秒かかっている場合、彼らが私たち全員を誘拐して手助けする前に、私たちは行動を起こさなければなりませんでした。そのため、私たちは自社で開発したERP / CRM / CMSの怪物を少し変えて、永続的な接続のすべての恐怖を直接体験しました。一見ランダムに発生したすべての微妙な小さな問題と奇妙な行動を追跡するのに数週間かかりました。ユーザーがアプリから熱心に絞り出した週に1回の致命的なエラーは、ロックされたテーブル、放棄されたトランザクション、およびその他の不幸な不安定な状態を残していることがわかりました。
この悲惨な話にはポイントがあります。それは、パフォーマンスの名の下に、私たちが決して破ることを予期していなかったものを破りました。 トレードオフはそれだけの価値はなく、ユーザーからの暴動なしで通常の接続に切り替えることができる日を待ち望んでいます。