PHP - 在exec()之前回显

时间:2014-02-14 21:59:34

标签: php exec echo

美好的一天!

我在执行exec()

之前遇到一些问题需要输出echo语句
 <?
    if (isset($_POST['ipaddress'])) {
       $escaped_command = escapeshellcmd($_POST['ipaddress']);

       if(filter_var($escaped_command, FILTER_VALIDATE_IP)) {
           echo "Gleaning ARP information, please wait..";
           $command = exec('sudo /sbin/getarp.exp');

执行$命令后输出echo语句。执行时间可以是15-30秒,具体取决于远程路由器上的ARP表的大小。是否有我不知道的操作顺序?似乎if语句中的所有语句都是并行执行的,而不是像我假设的那样逐行执行。

我宁愿不提供解决方案,但是一些文档链接会让我找到解决方案。我已经搜索了我的能力,但无法找到可行的解决方案。

任何帮助都将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为在将任何结果/输出发送到浏览器之前,脚本将完整运行。

答案 1 :(得分:1)

在PHP中有一个“输出缓冲”的概念。

每当您输出内容时(例如使用echoprint等),文本都会被输入缓冲区。此缓冲区仅在特定时间发送(例如,在请求结束时或缓冲区已满时)。

为了清空缓冲区(“冲洗”它),你需要手动完成。 flush()函数将执行此操作。有时您还需要调用ob_flush()(这是您自己打开自定义输出缓冲区)。一般来说,调用这两个函数并完成它是一个好主意:

echo 'Wait a few seconds...';
flush(); ob_flush();
sleep(3);
echo ' aaand we are done!';

有关PHP中输出缓冲的更多信息,请参阅Output Buffering Control

答案 2 :(得分:0)

这可能是输出缓冲区的问题。 PHP缓冲输出并以块的形式将其写入浏览器。尝试在echo和exec()之间添加对ob_flush()的调用;这将强制PHP将缓冲区的当前内容写入浏览器。

答案 3 :(得分:0)

默认情况下,php不会发送任何输出,直到php脚本完全运行完毕。有一个解决方案。但是,我听说它依赖于浏览器。我会在不同的系统和浏览器上测试它是否正常工作:

ob_implicit_flush (true)

在你的任何echo / print命令之前放置它,并且应该允许打印的任何内容显示在浏览器上。

更通用的方法是将您的页面与异步javascript集成。通常称为“AJAX”的过程。这有点困难,因为它需要使用许多交互脚本,一些客户端和一些服务器端。但是,AJAX是在网络上做这样的事情的事实方法。