繁体   English   中英

PHP-在exec()之前回显

[英]PHP - echo before exec()

美好的一天!

我在执行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');

执行$ command后,将输出echo语句。 执行时间可以在15到30秒之间的任意时间,具体取决于远程路由器上ARP表的大小。 有我不知道的操作顺序吗? 看来if语句中的所有语句都是并行执行的,而不是像我所假设的那样逐行执行。

我宁愿不提供解决方案,而是提供一些文档链接,这些链接会引导我找到解决方案。 我已经搜寻了我能找到的,但是找不到可行的解决方案。

任何帮助,将不胜感激。

谢谢。

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

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

每当您输出某些内容(例如,使用echoprint等)时,文本就会被扔到缓冲区中。 仅在某些时间(例如,在请求结束时或缓冲区已满时)发送此缓冲区。

为了清空缓冲区(以“刷新”它),您需要手动进行操作。 flush()函数将执行此操作。 有时您还需要调用ob_flush() (这是您自己打开自定义输出缓冲区的情况)。 通常,最好同时调用这两个函数并使用它来完成:

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

有关PHP中输出缓冲的更多信息,请参见输出缓冲控制

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

默认情况下,直到php脚本完全运行完毕,php才会发送任何输出。 有一个解决方案。 但是,我听说它与浏览器有关。 我将在不同的系统和浏览器上对其进行测试,以查看其是否正常运行:

ob_implicit_flush (true)

将其放在您的任何echo / print命令之前,并且应该允许所有打印的内容直接显示在浏览器中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM