我正在尝试找到一种方法让PHP向浏览器指示所有页面输出都已完成。页面完成后,我们正在运行一些通常不会花费很长时间的统计代码,但如果它确实存在,我不希望用户浏览器等待更多数据。这不能通过JavaScript完成,因为它需要与手机配合使用。
我已经开始使用
进行输出缓冲mb_http_output("UTF8");
ob_start("mb_output_handler");
确保我的网站MB文本(日文)没有问题。我希望ob_end_flush()可以做到这一点,但如果我放置睡眠(10);在ob_end_flush()之后,浏览器再等待10秒钟。有没有人对此有任何想法?
更新 使用jitters方法下面的“ob_gzhandler”让它与gzip一起使用,任何人都可以在这里看到任何可能的问题吗?
//may be also add headers for cache-control and expires (IE)
header("Connection: close"); //tells browser that connection will be closed
ob_start();
ob_start("ob_gzhandler");
//page content
ob_end_flush();
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
再次更新
请再看一下上面的代码。你需要做一个ob_start();在ob_start之前(“ob_gzhandler”);然后调用ob_end_flush();在调用ob_get_length()之前,您将获得正确的gzip压缩大小。
答案 0 :(得分:0)
沿着这些方向使用某些东西
//may be also add headers for cache-control and expires (IE)
header("Connection: close"); //tells browser that connection will be closed
ob_start();
//generate your output
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
//continue statistic processing
答案 1 :(得分:0)
我认为没有办法通知浏览器输出是否完整,至少从发送输出的脚本开始。如果您使用其他脚本来监视第一个脚本的输出并使用iframe,那么您可以这样做。
当页面被视为已加载时,浏览器知道输出何时完成。这就是浏览器所知道的。
答案 2 :(得分:0)
你可以在后台派一个新的php进程,让它来处理统计数据。就像是:
shell_exec('php stats.php &');
&最后确保它在后台运行,所以即使stats.php需要20秒,访问者也不会注意到它。 您可能需要将数据传递给stats脚本,您可以通过传入参数来执行此操作:
shell_exec('php stats.php -b '. escapeshellarg($_SERVER['HTTP_USER_AGENT']) .' &');
在stats.php中,您将使用$argv
变量来获取该数据。
但是如果统计代码运行时间不长,我不会这样做,因为为每个页面加载分配一个新进程会产生一些开销。我不知道是什么让stats代码需要很长时间才能处理,但另一种解决方案可能是将原始数据插入到数据库中,让后台作业处理该数据以创建可用的统计信息。这可以通过cron作业完成,也可以在处理队列的infinte循环中运行屏幕。
答案 3 :(得分:0)
尝试将您的统计代码移动到单独的函数,并在您呈现的页面上的javascript代码中的dom.ready或onload事件中使用ajax调用来调用此函数,如下面的元代码:
<html>
<script type="text/javascript">
dom.onready = Ajax.call(location.href + '?do_stats');
</script>
<body>...
</html>
dom.ready事件可以由jQuery或Prototype库提供。缺点是它只适用于启用js。
或者,您可以将统计数据的所有必需信息记录到数据库,并从那里调度收集排队数据的脚本并在后台处理 - 例如使用cron。