У меня есть «длинный» скрипт, который я хочу выполнить на странице PHP, и я хочу, чтобы его вывод «обновлялся», как только скрипт что-то выводит. Я прочитал множество решений, таких как questions 4706525, 9182094, 8882383, Руководство по сбросу PHP, но в моем случае оно не работает должным образом!
Мой тестовый скрипт:
#!/bin/bash
echo "This is a test script"
echo "Sleeping"
sleep 30
echo "Done"
Исполняемое разрешение установлено для www-data.
Моя PHP-страница:
<?php
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
@ini_set('output_buffering', 0);
@apache_setenv('output_buffering', 0);
echo "Here<br>";
flush();
$cmd = "../test.sh";
$pipes = array();
$descriptors = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
);
echo "Starting process<br>";
flush();
$process = proc_open($cmd, $descriptors, $pipes, realpath('./'), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
} else {
print "Cannot create process\n";
}
echo "</pre>";
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
?>
NB. Мой тестовый скрипт, test.sh, находится в каталоге над страницей PHP, таким образом, ../test.sh. Не то чтобы это что-то меняет. Но это не опечатка.
В моем php.ini они есть (хотя я не слишком стремился менять этот сервер в целом, но я хотел проверить, была ли проблема в этом):
zlib.output_compression = Off
output_buffering = Off
Я использую ЛАМПП.
Если я запускаю страницу PHP в терминале,
$ php test.php
Работает нормально: сразу получаю "Это тестовый скрипт" и "Спящий", а через некоторое время "Готово".
Если я загружаю страницу в свой браузер, она не работает: она ожидает завершения работы test.sh, прежде чем что-либо выводить.
Отредактировано: если я добавлю в цикл echo str_pad('',4096)."\n", тогда все заработает. Однако это исправление предполагает, что по непонятной мне причине для буферизации вывода по-прежнему установлено значение по умолчанию (4096), а не отключено, как я пытался настроить.
while ($s = fgets($pipes[1])) {
print $s;
echo str_pad('',4096)."\n";
flush();
}
Кроме того, это решение не идеально, потому что на самом деле оно добавляет пробелы к выходным данным.
Я ищу решение, которое
- обновляет вывод страницы PHP
- не изменяет php.ini
- не изменяет вывод
Спасибо!
print $s
в цикле, чтобы это былоprint $s . "\n"
, посмотрите, поможет ли это. - person marekful   schedule 28.08.2015str_pad('',4096)."\n";
) - person marekful   schedule 28.08.2015