apache — обновить вывод длинного процесса на странице PHP

У меня есть «длинный» скрипт, который я хочу выполнить на странице 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();
}

Кроме того, это решение не является идеальным, поскольку в действительности оно добавляет пробелы к выводу.

Я ищу решение, которое

  • обновляет вывод страницы PHP
  • не модифицирует php.ini
  • не изменяет вывод

Спасибо!

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]