Мы все видели, как эти программы показывают сообщение после выполнения каждой задачи, и если в какой-то момент появляется ошибка, она показывает эту ошибку. Например:
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>| |----</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);
Он показывает сообщения просто отлично, но только после завершения скрипта, а не в реальном времени. Я сделал это неправильно?
Вы пытались сбросить PHP после эхо-сообщения?
ob_flush();flush();
Это заставит PHP отправлять вывод клиенту (то есть любое эхо, которое вы выполнили с момента последней очистки)
Ну, вам нужно использовать ob_start, который запускает буферизацию вывода. Я думаю, что если вы хотите немедленно отправить вывод в браузер, то буферизацию следует вообще отключить. Функция сброса может использоваться для принудительной отправки вывода Php в браузер.
Если одна функция очистки не работает, то вам нужно отключить буферизацию вывода в вашем php.ini. Выходные данные из php могут также буферизироваться в нескольких местах, таких как расширения php, веб-браузер, модуль веб-браузера и прокси-сервер. Следующая директива должна быть добавлена в php.ini для отключения буферизации вывода:
zlib.output_compression = 0;
output_buffering = 0;