Pastikan untuk membaca jawaban ini di bawah ini , yang merinci cara untuk mengurangi masalah yang diuraikan di sini.
Kelemahan yang sama ada menggunakan PDO seperti dengan antarmuka database PHP lain yang melakukan koneksi tetap: jika skrip Anda berhenti tiba-tiba di tengah operasi database, permintaan berikutnya yang mendapatkan koneksi sisa akan mengambil di mana skrip mati ditinggalkan. Sambungan diadakan terbuka pada level manajer proses (Apache untuk mod_php, proses FastCGI saat ini jika Anda menggunakan FastCGI, dll), bukan pada level PHP, dan PHP tidak memberi tahu proses induk untuk membiarkan koneksi mati ketika script berakhir secara tidak normal.
Jika skrip mati mengunci tabel, tabel tersebut akan tetap terkunci hingga koneksi mati atau skrip berikutnya yang membuat koneksi membuka kunci tabel itu sendiri.
Jika skrip mati berada di tengah-tengah transaksi, yang dapat memblokir banyak tabel hingga penghenti waktu deadlock masuk, dan bahkan saat itu, penghitung waktu deadlock dapat membunuh permintaan yang lebih baru alih-alih permintaan yang lebih lama yang menyebabkan masalah.
Jika skrip mati berada di tengah-tengah transaksi, skrip berikutnya yang mendapatkan koneksi itu juga mendapatkan status transaksi. Sangat mungkin (tergantung pada desain aplikasi Anda) bahwa skrip berikutnya mungkin tidak pernah benar-benar mencoba untuk melakukan transaksi yang ada, atau akan melakukan ketika itu tidak seharusnya, atau memutar kembali ketika itu tidak seharusnya.
Ini hanya puncak gunung es. Itu semua dapat dikurangi sampai batas tertentu dengan selalu mencoba untuk membersihkan setelah koneksi yang kotor pada setiap permintaan skrip tunggal, tetapi itu bisa menjadi sakit tergantung pada database. Kecuali Anda telah mengidentifikasi membuat koneksi database sebagai satu hal yang menjadi hambatan dalam skrip Anda (ini berarti Anda telah melakukan pembuatan kode menggunakan xdebug dan / atau xhprof ), Anda tidak boleh menganggap koneksi persisten sebagai solusi untuk apa pun.
Lebih lanjut, kebanyakan basis data modern (termasuk PostgreSQL) memiliki cara sendiri yang disukai untuk melakukan penggabungan koneksi yang tidak memiliki kelemahan langsung seperti koneksi persisten berbasis vanilla PHP.
Untuk memperjelas suatu hal, kami menggunakan koneksi terus-menerus di tempat kerja saya, tetapi tidak dengan pilihan. Kami menjumpai perilaku koneksi yang aneh , di mana koneksi awal dari server aplikasi kami ke server database kami memakan waktu tepat tiga detik, padahal seharusnya sepersekian detik. Kami pikir itu adalah bug kernel. Kami menyerah untuk mencoba memecahkannya karena itu terjadi secara acak dan tidak dapat diproduksi ulang sesuai permintaan, dan IT outsourcing kami tidak memiliki kemampuan konkret untuk melacaknya.
Bagaimanapun, ketika orang-orang di gudang memproses beberapa ratus bagian yang masuk, dan setiap bagian mengambil tiga setengah detik, bukannya setengah detik, kami harus mengambil tindakan sebelum mereka menculik kami semua dan membuat kami membantu mereka. Jadi, kami membalikkan beberapa bit dalam sistem ERP / CRM / CMS kami yang tumbuh sendiri di rumah dan mengalami semua kengerian dari koneksi persisten secara langsung. Kami butuh berminggu - minggu untuk melacak semua masalah kecil yang halus dan perilaku aneh yang terjadi secara acak. Ternyata kesalahan fatal sekali seminggu yang para pengguna kami rajin peras dari aplikasi kami adalah meninggalkan meja terkunci, transaksi terbengkalai, dan keadaan sial lainnya yang tidak menguntungkan.
Kisah sedih ini ada benarnya: Ini menghancurkan hal-hal yang kami tidak pernah harapkan akan hancur, semua atas nama pertunjukan. Pengorbanannya tidak sepadan, dan kami sangat menunggu hari di mana kami dapat kembali ke koneksi normal tanpa kerusuhan dari pengguna kami.