2010-01-28 30 views
6

Tôi có một lớp trình xử lý phiên gọi session_write_close() ở cuối tập lệnh. Điều này đảm bảo rằng ngay cả khi một tiêu đề() hoặc exit() được phát hành dữ liệu phiên được lưu.Sự cố PHP với các phiên đồng thời và AJAX

public function __destruct() 
{ 
    session_write_close(); 
} 

Tuy nhiên, tôi đã nhận thấy rằng đối với một trong các trang AJAX của tôi HAI cập nhật phiên được lớp cơ sở dữ liệu cam kết.

Tôi đoán là trang [1] tải và gửi yêu cầu AJAX [2]. Yêu cầu AJAX [2] đó phải bắt đầu phiên trước khi trang [1] có cơ hội gọi session_write_close().

Sau khi trang [2] AJAX đã tải phiên rồi trang [1] cuối cùng lưu phiên và sau đó ngay sau khi [2] yêu cầu AJAX lưu phiên của nó - ghi đè phiên đầu tiên!

Nó có thể trông như thế này:

[1] page loads session 
[1] page sends output 
[2] ajax loads session 
[1] page saves session 
[2] ajax sends output 
[2] ajax saves session 

Tôi phải làm gì để đảm bảo một trang không tải một phiên trước khác có cơ hội để lưu phiên?

+0

Điều này rất thú vị ... Tôi chưa bao giờ gặp vấn đề này (gõ vào silic) mặc dù tấn sử dụng ajax cho tất cả các mục đích để im quan tâm đến câu trả lời về điều này. – prodigitalson

Trả lời

3

Giả định là sai.

... dữ liệu phiên bị khóa để tránh viết đồng thời chỉ có một kịch bản có thể hoạt động trên một phiên bất cứ lúc nào http://us.php.net/session_write_close

Nói cách khác, bạn có thể chạy 100 yêu cầu AJAX cho một người dùng cùng một lúc và họ sẽ đợi đến lượt họ.

Sự cố của tôi hóa ra là lỗi khi chọn cột trong bảng phiên phù hợp dẫn đến các phiên của tôi được tạo lại mỗi lần tải.

+0

..những gì sẽ giải thích sự thiếu thông tin về "vấn đề" này ... – Xeoncross

Các vấn đề liên quan