美好的一天!
我在执行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语句中的所有语句都是并行执行的,而不是像我假设的那样逐行执行。
我宁愿不提供解决方案,但是一些文档链接会让我找到解决方案。我已经搜索了我的能力,但无法找到可行的解决方案。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:4)
这种情况正在发生,因为在将任何结果/输出发送到浏览器之前,脚本将完整运行。
答案 1 :(得分:1)
在PHP中有一个“输出缓冲”的概念。
每当您输出内容时(例如使用echo
,print
等),文本都会被输入缓冲区。此缓冲区仅在特定时间发送(例如,在请求结束时或缓冲区已满时)。
为了清空缓冲区(“冲洗”它),你需要手动完成。 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是在网络上做这样的事情的事实方法。