我们都看到这些程序在每个任务完成后显示一条消息,如果某个时候出现错误,则会显示该错误。例如:
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);
它显示消息很好但仅在脚本完成后才显示,而不是实时。我做错了吗?
答案 0 :(得分:0)
您是否在回显消息后尝试刷新PHP?
ob_flush();flush();
这将强制PHP将输出发送到客户端(即自上次刷新以来执行的任何回显)
答案 1 :(得分:0)
你需要使用ob_start,它启动输出缓冲。我想如果你想立即将输出发送到浏览器,那么应该完全禁用缓冲。 flush函数可用于强制将Php输出发送到浏览器。
如果单独刷新功能不起作用,则需要在php.ini中禁用输出缓冲。 php的输出也可以在几个位置进行缓冲,例如php扩展,Web浏览器,Web浏览器模块和代理服务器。应该在php.ini中添加以下指令以禁用输出缓冲:
zlib.output_compression = 0;
output_buffering = 0;