如何在每个代码语句实时执行后回显状态消息?

时间:2017-02-20 06:30:10

标签: php

我们都看到这些程序在每个任务完成后显示一条消息,如果某个时候出现错误,则会显示该错误。例如:

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);

它显示消息很好但仅在脚本完成后才显示,而不是实时。我做错了吗?

2 个答案:

答案 0 :(得分:0)

您是否在回显消息后尝试刷新PHP?

ob_flush();flush();

这将强制PHP将输出发送到客户端(即自上次刷新以来执行的任何回显)

Check out PHP manual to see code examples.

答案 1 :(得分:0)

你需要使用ob_start,它启动输出缓冲。我想如果你想立即将输出发送到浏览器,那么应​​该完全禁用缓冲。 flush函数可用于强制将Php输出发送到浏览器。

如果单独刷新功能不起作用,则需要在php.ini中禁用输出缓冲。 php的输出也可以在几个位置进行缓冲,例如php扩展,Web浏览器,Web浏览器模块和代理服务器。应该在php.ini中添加以下指令以禁用输出缓冲:

zlib.output_compression = 0;
output_buffering = 0;