Как отобразить сообщение о состоянии после выполнения каждого оператора кода в реальном времени?

Мы все видели, как эти программы показывают сообщение после выполнения каждой задачи, и если в какой-то момент появляется ошибка, она показывает эту ошибку. Например:

Task A Done
Task B Fone
etc...
// If an error happens
Error Completing Task Q: {error message}
// Or if no error
Task X Done
Task Z Done
Complete

Я хочу сделать это с помощью сценария, который мне нужен, чтобы показать мне, где именно у сценария есть проблема. Теперь у меня нет предварительно настроенных сообщений об ошибках, только подтверждения. Но они могут быть сделаны позже, если это будет необходимо. Мне не нужно, чтобы кто-нибудь давал мне новый код для архивирования архивов, потому что этот скрипт работает нормально. Я собираюсь отредактировать его для новой функции и хочу видеть процессы, особенно если я использую его на внешнем интерфейсе в качестве службы для своих пользователей.

Код:

$zip=new ZipArchive();
if (file_exists($archive)) {
unlink($archive);
}
if (extension_loaded('zip')) {
$debug='<b>Extension (.zip) Is Loaded</b><br /><b><u>Beginning Search For:</u></b> (' . $folder . ')<br />';
if (file_exists(realpath($folder))) {
$debug='<b><u>Found:</u></b> (' . $folder . ')<br />';
if ($zip->open($archive, ZipArchive::OVERWRITE | ZipArchive::CREATE )) {
$debug='<b><u>Archive Opened:</u></b> (' . $archive . ')<br />';
if (is_dir(realpath($folder))) {
$debug='<b>Beginning Recursive Directory Scan Of Folder: (</b>' . basename($folder) . ')<br />';
$files=new RecursiveIteratorIterator(new RecursiveDirectoryIterator($folder), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file) {
if (is_dir(realpath($file))) {
$debug='<b><u>Adding Directory:</u></b> (' . basename($file) . ')<br />';
$zip->addEmptyDir(zipDir($file));
$dirTree='<b>|</b><br /><b>|----</b>' . $file . '<br />';
} elseif (is_file($file)) {
$debug='<b><u>Adding File:</u></b> (' . basename($file) . ')<br />';
$zip->addFromString(insertFile($file), file_get_contents($file));
$dirTree='<b>|&nbsp;&nbsp;&nbsp;&nbsp;|----</b>' . basename($file) . '<br />';
} else {
exit($zip->getStatusString());
}
}
} else if (is_file($folder)) {
$debug='<b><u>Adding File In Archive Root:</u></b> (' . basename($folder) . ')<br />';
$zip->addFromString(zipDir($folder), file_get_contents($folder));
} else {
$debug='<b>No Directories Or Files Found In (' . $folder . ')</b>';
}
} if ($zip->close() !== FALSE) {
return true;
}
}
}
}

Как видите, у меня есть $debug заявления, а также $$dirTree заявления. Я хотел иметь / дать возможность отображать сообщения о состоянии стека или дерево каталогов (также в режиме реального времени). Так как же мне поступить? Заранее спасибо!

Обновить

Я попробовал ob_flush(); flush(); в функции, чтобы ее можно было назвать универсально:

function debugScript($string, $x='0') {
if ($x === 1) {
echo $string;
ob_flush();
flush();
} else {
return $string;
}
}

И отредактировал все $debug заявления вроде так:

$debug='{message}<br />'; debugScript($debug, 1);

Он показывает сообщения просто отлично, но только после завершения скрипта, а не в реальном времени. Я сделал это неправильно?

0

Решение

Вы пытались сбросить PHP после эхо-сообщения?

ob_flush();flush();

Это заставит PHP отправлять вывод клиенту (то есть любое эхо, которое вы выполнили с момента последней очистки)

Посмотрите руководство по PHP, чтобы увидеть примеры кода.

0

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

Ну, вам нужно использовать ob_start, который запускает буферизацию вывода. Я думаю, что если вы хотите немедленно отправить вывод в браузер, то буферизацию следует вообще отключить. Функция сброса может использоваться для принудительной отправки вывода Php в браузер.

Если одна функция очистки не работает, то вам нужно отключить буферизацию вывода в вашем php.ini. Выходные данные из php могут также буферизироваться в нескольких местах, таких как расширения php, веб-браузер, модуль веб-браузера и прокси-сервер. Следующая директива должна быть добавлена ​​в php.ini для отключения буферизации вывода:

zlib.output_compression = 0;
output_buffering = 0;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector