Примітка для користувачів mod_fcgid (будь ласка, використовуйте на свій страх і ризик).
Швидке рішення
Прийнята відповідь Джорі Себрехтса справді функціональна. Однак якщо ви використовуєте mod_fcgid, ви можете виявити, що це рішення не працює самостійно. Іншими словами, коли функція промивання називається, з'єднання з клієнтом не закривається.
Параметр FcgidOutputBufferSize
конфігурації mod_fcgid може бути винним. Я знайшов цю пораду в:
- ця відповідь Travers Carter та
- це повідомлення в блозі Seumas Mackinnon .
Прочитавши вищесказане, ви можете дійти висновку, що швидким рішенням буде додати рядок (див. "Приклад віртуального хоста" в кінці):
FcgidOutputBufferSize 0
у вашому файлі конфігурації Apache (наприклад, httpd.conf), у вашому файлі конфігурації FCGI (наприклад, fcgid.conf) або у вашому віртуальному файлі хостів (наприклад, httpd-vhosts.conf).
У (1) вище згадується змінна назва "OutputBufferSize". Це стара назва FcgidOutputBufferSize
згаданого в (2) (див. Примітки про оновлення на веб-сторінці Apache для mod_fcgid ).
Деталі та друге рішення
Вищевказане рішення вимикає буферизацію, виконану mod_fcgid або для всього сервера, або для конкретного віртуального хоста. Це може призвести до покарання ефективності вашого веб-сайту. З іншого боку, це може бути не так, оскільки PHP виконує буферизацію самостійно.
Якщо ви не хочете відключити буферизацію mod_fcgid , є ще одне рішення ... ви можете змусити цей буфер спалахнути .
Нижче наведений код робить саме це, спираючись на рішення, запропоноване Джорі Себрехтом:
<?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');
?>
Що доданий рядок коду, по суті, - це заповнення буфера mod_fcgi , таким чином, примушуючи його розмиватися . Число "65537" було обрано тому, що значення за замовчуванням FcgidOutputBufferSize
змінної - "65536", як зазначено на веб-сторінці Apache відповідної директиви . Отже, вам може знадобитися відповідно скоригувати це значення, якщо інше значення встановлено у вашому оточенні.
Моє довкілля
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, не захищена ниткою
- mod_fcgid / 2.3.9
- Windows 7 Professional x64
Приклад Віртуальний хост
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>