当php脚本仍然执行时回显消息

时间:2011-01-12 14:22:12

标签: php curl messages

我有一个使用cURL的php脚本,大约需要10-15分钟才能执行。它做了什么,它解析大约1000页寻找特定的匹配,并在整个脚本中我有回声消息,如“转到下一页”,“找到匹配”,“加载页面错误”...现在它的工作方式(以及它的正常方式)是执行10分钟,然后才会吐出所有自定义消息。 我希望能够在这些消息发生时显示这些消息,而不是在脚本执行完毕时。我在想像AJAX这样的东西,但我不确定它是如何工作的。任何提示都非常感谢。谢谢。

9 个答案:

答案 0 :(得分:10)

所以,这是一个老帖子,但我找到了解决方案。因为我还必须做同样的事情,在脚本仍在运行时输出。这里没有任何答案有帮助。 首先,我使用Win32服务器(生产)和XAMPP作为本地测试。这个例子只是一个概念证明,可以随意修改。

<?php 
ob_implicit_flush(true);
for($i=1; $i<=10; $i++){
echo "$i ...<br>";
for($k = 0; $k < 40000; $k++) echo ' ';
sleep(1);
}
?>

因此,我们打开输出缓冲区为隐式。然后我们制作一个从1到10计数的演示循环,并在处理它们时显示它们。第二个循环将填充浏览器缓冲区。最后检查一切是否正常,我们睡了1秒钟。否则脚本运行得太快,我们无法知道我们是否实现了目标。 希望这有帮助!

答案 1 :(得分:7)

您可以创建一个临时表。

PHP脚本可以,而不是回显消息,将它们存储到数据库表(可能是内存表以获得性能)。

然后,您可以使用ajax定期轮询单独的PHP脚本,该脚本将查询该表,并将任何新消息返回给客户端。

答案 2 :(得分:6)

使用flush通过刷新输出缓冲区立即将输出发送到浏览器。

echo "foo";
flush();
echo "bar";
flush();

答案 3 :(得分:3)

实际上你正在寻找像flushob_flush这样的东西,但请记住,有很多因素可以阻止你的输出被冲洗掉。

flush文档中获取:

  

多个服务器,尤其是Win32上的服务器,仍会缓冲脚本的输出,直到它终止,然后才将结果传输到浏览器。

     

像mod_gzip这样的Apache服务器模块可能会自行缓冲,这会导致flush()不会导致数据立即发送到客户端。

答案 4 :(得分:1)

我在每@ob_flush()之后使用echo。在此示例中,PHP_EOL$string

之后创建了一个新行
function output($string){
    echo $string.PHP_EOL;
    @ob_flush();
}

答案 5 :(得分:0)

基本上,让您的脚本将HTML输出写入临时日志文件。然后使用ajax定期使用临时日志文件更新最终用户的浏览器。 jQuery将快速完成这项工作。

Ajax是使其适用于所有浏览器的唯一保证方式。这是来自PHP的flush页面的引用。

  

flush() 可能无法覆盖   你网络的缓冲方案   服务器,它对任何都没有影响   浏览器中的客户端缓冲 。   它也不会影响PHP的用户空间   输出缓冲机制。这意味着   你必须同时调用ob_flush()   和flush()来刷新ob输出   缓冲区,如果您正在使用它们。

答案 6 :(得分:0)

听起来好像你已output buffering开启了。

调用ob_end_flush()将打印缓冲区中当前的内容,并关闭缓冲区以执行其余的脚本。

答案 7 :(得分:0)

您可以使用flush()函数将缓冲区的所有内容发送到客户端。 http://php.net/manual/fr/function.flush.php

答案 8 :(得分:0)

您可以同时使用-(void) layoutSubviews { [super layoutSubviews]; for (UIView *view in self.subviews) { if ([view isKindOfClass:[UIView class]] || [view isKindOfClass:[UIButton class]] || [view isKindOfClass:[UISearchBar class]] || [view isKindOfClass:[UILabel class]]) { CGRect frame = view.frame; frame.origin.y = (self.frame.size.height - frame.size.height) / 2.f; view.frame = frame; } } } flush,提醒您设置内容类型标题:

ob_flush

来源: dermeister 在php.net ob_flush页面中注明。

在Firefox 42.0和Chrome 46.0上测试