Lưu ý cho người dùng mod_fcgid (vui lòng tự chịu rủi ro khi sử dụng).
Giải pháp nhanh
Câu trả lời được chấp nhận của Joeri Sebrechts thực sự là chức năng. Tuy nhiên, nếu bạn sử dụng mod_fcgid, bạn có thể thấy rằng giải pháp này không tự hoạt động. Nói cách khác, khi chức năng tuôn ra được gọi là kết nối với máy khách không bị đóng.
Các FcgidOutputBufferSize
tham số cấu hình của mod_fcgid có thể đổ lỗi. Tôi đã tìm thấy mẹo này trong:
- câu trả lời này của Travers Carter và
- bài đăng trên blog này của Seumas Mackinnon .
Sau khi đọc phần trên, bạn có thể đi đến kết luận rằng giải pháp nhanh chóng là thêm dòng (xem "Máy chủ ảo mẫu" ở cuối):
FcgidOutputBufferSize 0
trong tệp cấu hình Apache của bạn (ví dụ: httpd.conf), tệp cấu hình FCGI của bạn (ví dụ: fcgid.conf) hoặc trong tệp máy chủ ảo của bạn (ví dụ: httpd-vhosts.conf).
Trong (1) ở trên, một biến có tên "OutputBufferSize" được đề cập. Đây là tên cũ của tên FcgidOutputBufferSize
được đề cập trong (2) (xem ghi chú nâng cấp trong trang web Apache cho mod_fcgid ).
Chi tiết & Giải pháp thứ hai
Giải pháp trên vô hiệu hóa bộ đệm được thực hiện bởi mod_fcgid cho toàn bộ máy chủ hoặc cho một máy chủ ảo cụ thể. Điều này có thể dẫn đến một hình phạt về hiệu suất cho trang web của bạn. Mặt khác, điều này có thể không đúng vì PHP tự thực hiện việc đệm.
Trong trường hợp bạn không muốn vô hiệu hóa bộ đệm của mod_fcgid , có một giải pháp khác ... bạn có thể buộc bộ đệm này xả .
Đoạn mã dưới đây thực hiện điều đó bằng cách xây dựng trên giải pháp do Joeri Sebrechts đề xuất:
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
echo(str_repeat(' ', 65537)); // [+] Line added: Fill up mod_fcgi's buffer.
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>
Những gì dòng mã được thêm vào về cơ bản là lấp đầy bộ đệm của mod_fcgi , do đó buộc nó phải tuôn ra. Số "65537" được chọn vì giá trị mặc định của FcgidOutputBufferSize
biến là "65536", như đã đề cập trong trang web Apache cho chỉ thị tương ứng . Do đó, bạn có thể cần phải điều chỉnh giá trị này cho phù hợp nếu một giá trị khác được đặt trong môi trường của bạn.
Môi trường của tôi
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, Không an toàn cho luồng
- mod_fcgid / 2.3.9
- Windows 7 Professional x64
Máy chủ ảo mẫu
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>