У меня есть «длинный» скрипт, который я хочу выполнить на странице PHP, и я хочу, чтобы его вывод обновлялся, как только скрипт что-то выводит.
Я прочитал множество решений, таких как вопросы 4706525, 9182094, 8882383, PHP Flush Manual но это не работает как положено в моем случае!
Мой тестовый скрипт:
#!/bin/bash
echo "This is a test script"echo "Sleeping"sleep 30
echo "Done"
Разрешение на выполнение задается для www-данных.
Моя страница 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
Я использую LAMPP.
Если я запускаю страницу 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();
}
Кроме того, это решение не является идеальным, поскольку в действительности оно добавляет пробелы к выводу.
Я ищу решение, которое
Спасибо!
Задача ещё не решена.
Других решений пока нет …