Kemungkinan rantai sebab akibat
- server tidak menyadari bahwa permintaan XHR dibatalkan, sehingga proses PHP yang sesuai tetap berjalan
- proses PHP ini menggunakan sesi, dan mencegah akses bersamaan ke sesi ini hingga proses tersebut dihentikan
Kemungkinan solusi
Mengatasi salah satu dari dua poin di atas memutus rantai dan dapat memperbaiki masalah:
- (a)
ignore_user_abort
adalahFALSE
secara default, tetapi Anda dapat menggunakan pengaturan non-standar. Ubah pengaturan ini kembali keFALSE
di dalam kamuphp.ini
atau hubungiignore_user_abort(false)
dalam skrip yang menangani permintaan yang dapat diinterupsi ini.
Kelemahan:skrip baru saja berakhir. Pekerjaan apa pun yang sedang berlangsung akan dihentikan, mungkin meninggalkan sistem dalam keadaan kotor.
- (b) Secara default, PHP tidak akan mendeteksi bahwa pengguna telah membatalkan koneksi sampai ada upaya untuk mengirim informasi ke klien. Lakukan
echo
sesuatu secara berkala selama skrip Anda berjalan lama.
Kelemahan:data dummy ini mungkin merusak output normal skrip Anda. Dan di sini juga, skrip dapat meninggalkan sistem dalam keadaan kotor.
- Sesi PHP disimpan sebagai file di server. Pada
session_start()
, skrip membuka file sesi dalam mode tulis, secara efektif memperoleh kunci eksklusif di atasnya. Permintaan berikutnya yang menggunakan sesi yang sama akan ditunda hingga kunci dilepaskan. Ini terjadi ketika skrip berakhir, kecuali Anda menutup sesi secara eksplisit. Hubungisession_write_close()
atausession_abort()
sedini mungkin.
Kelemahan:saat ditutup, sesi tidak dapat ditulis lagi (kecuali jika Anda membuka kembali sesi , tetapi ini adalah peretasan yang agak tidak elegan). Juga skrip tetap berjalan, mungkin membuang-buang sumber daya.
Saya pasti merekomendasikan opsi terakhir.