[PHP] Session file và Ajax request

Standard

Kịch bản:

– Khi user truy cập vào 1 page, 1 phần content được tải về sau thông qua Ajax.
– Content này thường phải mất vài 3 giây mới có thể xử lý xong, chuyện này cũng không có gì vì đã làm hiệu ứng loading và cũng chỉ 1 phần content của page thôi.

Vấn đề:

– Trong thời gian chờ respond từ ajax request, user dù có click link trên page (ví dụ: 1 menu nào đó), thì trình duyệt không xử lý gì cả, chỉ cho đến khi có dữ liệu từ server trả về, lệnh click mới có thể thực thi.

Lưu ý: Đang nói về truy cập cùng 1 server nhé.

Tại sao vậy? trong ajax-request đã set async: true rồi. Sao không di chuyển (navigate) ngay mà lại đợi nhỉ? Sau vài ngày loanh quanh cái vụ Asynchronous này, sau đó bỏ đi làm chuyện khác, sau đó quay lại nghiên cứu chưa tìm ra. Thì may sao bữa nay mới tìm ra bản chất của vấn đề.

Số là vầy:

PHP writes its session data to a file by default. When a request is made to a PHP script that starts the session (session_start()), this session file is locked. What this means is that if your web page makes numerous requests to PHP scripts, for instance, for loading content via Ajax, each request could be locking the session and preventing the other requests from completing.

The other requests will hang on session_start() until the session file is unlocked. This is especially bad if one of your Ajax requests is relatively long-running.

Khi có 1 ajax request gửi về, PHP sẽ xử lý, theo mặc định file session sẽ bị lock lại (nếu có gọi hàm session_start() trong code), và chỉ được unlock khi nó xử lý xong. Aha, vậy là các chú đến sau ngồi đợi anh unlock nhé. Vậy thế cho nên, khi user click 1 link trên trình duyệt mà trước đó có 1 ajax-request, trình duyệt cũng đã gửi request về server, server (đang lock file session do ajax-request chưa xử lý xong): “sorry em, session file đang bị lock rồi, chú em đợi nó unlock rồi anh xử lý nhé” (lúc này trong code là hang vị trí session_start()), browser không thấy server respond gì cả, đợi thôi chứ sao, user thì thấy click cũng không load gì cả (đang đợi mà). Kẹt xe tại khúc xử lý file session, đây mới là bản chất của vấn đề trình duyệt không navigate khi đang đợi 1 ajax-request.

Hiện tượng trên không bị để ý thấy nếu ajax-request chỉ là các tác vụ nhỏ nhỏ, giải quyết nhanh, nếu cần xử lý lâu thì sẽ thấy vấn đề ngay.

Cách giải quyết:

Trong PHP support 1 hàm là: session_write_close();, có tác dụng: truy cập session file chế độ chỉ đọc (read-only), sẽ không phải đợi việc unlock. Khi đó request sẽ được xử lý ngay.

Còn kỹ thuật lập trình ntn để khi nào mới gọi hàm trên thì tùy từng người thôi.

ASP cũng tương tự nhé.

Nguồn tham khảo:

  1. Google
  2. http://konrness.com/php5/how-to-prevent-blocking-php-requests/

Leave a Reply

Your email address will not be published. Required fields are marked *

69 − = 68