Chuỗi nhân quả có thể xảy ra
- máy chủ không nhận ra rằng các yêu cầu XHR đã bị hủy và do đó, các quy trình PHP tương ứng tiếp tục chạy
- các quy trình PHP này sử dụng các phiên và ngăn truy cập đồng thời vào phiên này cho đến khi chúng chấm dứt
Các giải pháp khả thi
Nhấn vào một trong hai điểm trên sẽ phá vỡ chuỗi và có thể khắc phục sự cố:
- (a)
ignore_user_abort
làFALSE
theo mặc định, nhưng bạn có thể đang sử dụng cài đặt không chuẩn. Thay đổi cài đặt này trở lạiFALSE
trong bạnphp.ini
hoặc gọiignore_user_abort(false)
trong các tập lệnh xử lý các yêu cầu gián đoạn này.
Nhược điểm:kịch bản vừa kết thúc. Mọi công việc đang thực hiện đều bị gián đoạn, có thể khiến hệ thống ở trạng thái bẩn.
- (b) Theo mặc định, PHP sẽ không phát hiện ra rằng người dùng đã hủy bỏ kết nối cho đến khi thực hiện một nỗ lực gửi thông tin đến máy khách. Thực hiện
echo
một cái gì đó định kỳ trong suốt quá trình chạy tập lệnh dài hạn của bạn.
Hạn chế:dữ liệu giả này có thể làm hỏng đầu ra bình thường của tập lệnh của bạn. Và ở đây nữa, tập lệnh có thể khiến hệ thống ở trạng thái bẩn.
- Phiên PHP được lưu trữ dưới dạng tệp trên máy chủ. Trên
session_start()
, tập lệnh mở tệp phiên ở chế độ ghi, có được một khóa độc quyền trên đó một cách hiệu quả. Các yêu cầu tiếp theo sử dụng cùng một phiên được giữ cho đến khi khóa được giải phóng. Điều này xảy ra khi tập lệnh kết thúc, trừ khi bạn đóng phiên một cách rõ ràng. Gọisession_write_close()
hoặcsession_abort()
càng sớm càng tốt.
Hạn chế:khi đóng, phiên này không thể được ghi nữa (trừ khi bạn mở lại phiên này , nhưng đây là một vụ hack có phần không phù hợp). Ngoài ra, tập lệnh vẫn tiếp tục chạy, có thể gây lãng phí tài nguyên.
Tôi chắc chắn khuyên bạn nên lựa chọn cuối cùng.