Tình huống:

  • Trang web có 1 phần nội dung được tải qua ajax.
  • Nội dung load qua ajax có 1 số xử lý khá lâu >3 giây
  • ajax-request set async: true

Vấn đề:

  • Khi load page có phần nội dung xử lý lâu nêu trên qua ajax, người dùng không thể chuyển trang, chỉ đến khi nội dung được tải xong việc chuyển trang mới được xử lý

Nguyên nhân:

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 nhận ajax request, 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. Các request khác về server nếu đụng đến việc write vào session file đều pending cho đến khi process trước đó được xử lý xong (unlock file). Điều này giải thích khi user click 1 link trên trình duyệt mà trước đó có 1 ajax-request xử lý lâu, cho dù user (trình duyệt) gửi tiếp request về server thì vẫn phải chờ cho đến khi file session được unlock.

Giải quyết:

PHP support hàm: session_write_close();, có tác dụng: kết thúc việc lock file session truy cập session file chế độ chỉ đọc (read-only).

Nguồn tham khảo:

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