Первый шаг - увидеть, куда идет вывод. Первое, что я хотел бы сделать, это выбрать файл немного меньшего размера, чтобы вы не ожидали около семи минут для каждого теста.
Шаг 1 / Посмотрите, где что пишется в оболочке. Выполните команду python last >/tmp/stdout 2>/tmp/stderr
, затем посмотрите на эти два файла. В идеале все будет записано на стандартный вывод, но это может быть не так. Это дает вам базовое поведение сценария.
Шаг 2 / Сделайте то же самое при запуске из PHP с помощью $handle = popen('python last >/tmp/stdout 2>/tmp/stderr', 'r');
. В этом случае ваш PHP-скрипт, вероятно, ничего не вернет, но файлы все равно должны быть заполнены Это отразит любое измененное поведение при работе в нетерминальной среде.
Если часть вывода идет в stderr, то решение должно быть таким простым: $handle = popen('python last 2>&1', 'r');
Кроме того, документация по PHP-состояниям (мое выделение):
Returns a file pointer identical to that returned by fopen(), except that it is unidirectional (may only be used for reading or writing) and must be closed with pclose(). This pointer may be used with <strong>fgets()</strong>, <strong>fgetss()</strong>, and <strong>fwrite()</strong>.
Так что я не уверен, что вы даже должны использовать fread()
, хотя это показано в одном из примеров. Тем не менее, я думаю, что линейный ввод больше соответствует тому, чего вы пытаетесь достичь.
Независимо от всего этого, вы должны прочитать вывод в цикле, чтобы убедиться, что вы можете получить вывод, когда он больше 4K, что-то вроде:
$handle = popen ('python last 2>&1', 'r');
if ($handle) {
while(! feof ($handle)) {
$read = fgets ($handle);
echo $read;
}
pclose ($handle);
}
Еще одна вещь, на которую следует обратить внимание: если вы выводите данные в браузер и это занимает слишком много времени, сам браузер может отключиться, поскольку считает, что соединение на стороне сервера исчезло. Если вы обнаружите, что небольшой файл работает, а ваш файл 10M / 1minute не работает, это может иметь место. Вы можете попробовать flush()
, но не все браузеры выполнят это.