Я тестирую некоторые виды поведения ob_flush
в моем ноутбуке с Ubuntu, используя Apache2, PHP5 и браузер Firefox.
Следующий код печатает числа от 0 до 9 со второй паузой.
Каждый раз, когда он отображает число — он должен сбросить его обратно в браузер.
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
header('Content-type: text/html; charset=utf-8');
echo memory_get_usage() / 1024 / 1024 . "<br>";
echo "The time is " . date("h:i:sa") . "<br>";
echo memory_get_usage() / 1024 / 1024 . "<br>";
for ($i = 0; $i < 10; $i++) {
echo $i . " - " . memory_get_usage() / 1024 / 1024 . '<br />';
flush();
ob_flush();
sleep(1);
}
sleep(1);
echo 'End ...<br />';
echo "The time is " . date("h:i:sa");
Я запустил код одновременно в 2 разных окнах Firefox, и это был вывод:
Первое окно браузера:
0.26750183105469
The time is 04:17:09pm
0.26776123046875
0 - 0.26792144775391
1 - 0.26787567138672
2 - 0.26787567138672
3 - 0.26787567138672
4 - 0.26787567138672
5 - 0.26787567138672
6 - 0.26787567138672
7 - 0.26787567138672
8 - 0.26787567138672
9 - 0.26787567138672
End ...
The time is 04:17:20pm
Второе окно браузера:
0.26509094238281
The time is 04:17:11pm
0.26535034179688
0 - 0.26551055908203
1 - 0.26546478271484
2 - 0.26546478271484
3 - 0.26546478271484
4 - 0.26546478271484
5 - 0.26546478271484
6 - 0.26546478271484
7 - 0.26546478271484
8 - 0.26546478271484
9 - 0.26546478271484
End ...
The time is 04:17:22pm
Вы могли ясно видеть, что два запроса обрабатывались Apache одновременно и что использование памяти составляло 0,26 МБ.
Все хорошо, все счастливы 🙂
Я скопировал и вставил этот код в метод класса, и внезапно Apache перестал обрабатывать запросы одновременно, а один за другим.
Это новый код:
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
header('Content-type: text/html; charset=utf-8');
echo memory_get_usage() / 1024 / 1024 . "<br>";
$task = new TestTask(null);
$task->start();
Опять же — я отправил запрос одновременно в 2 разных окнах Firefox:
Первое окно браузера:
0.26746368408203
The time is 04:20:34pm
2.3088989257812
0 - 2.3089752197266
1 - 2.3089294433594
2 - 2.3089294433594
3 - 2.3089294433594
4 - 2.3089294433594
5 - 2.3089294433594
6 - 2.3089294433594
7 - 2.3089294433594
8 - 2.3089294433594
9 - 2.3089294433594
End ...
The time is 04:20:45pm
Второе окно браузера:
0.26506042480469
The time is 04:20:45pm
2.3051910400391
0 - 2.3052673339844
1 - 2.3052215576172
2 - 2.3052215576172
3 - 2.3052215576172
4 - 2.3052215576172
5 - 2.3052215576172
6 - 2.3052215576172
7 - 2.3052215576172
8 - 2.3052215576172
9 - 2.3052215576172
End ...
The time is 04:20:56pm
Здесь вы можете видеть, что он был обработан Apache один за другим (с учетом времени), а также — поскольку я инкапсулировал код внутри класса — использование памяти возросло до 2,3 МБ.
Я предположил, что это связано с лимитом памяти PHP (установленным 128 МБ) или объемом памяти, который может быть выделен параллельными запросами Apache, или, может быть, что-то в ОС (Ubuntu)? ограничение объема памяти PHP рамки могут выделить?
Я установил для MaxClients of Apache смехотворно высокое число, чтобы убедиться, что он не имеет к этому никакого отношения.
Любые идеи, где или что я должен искать и переустанавливать?
Задача ещё не решена.
Других решений пока нет …