我首先配置我的脚本甚至可以运行后HTTP请求结束
ignore_user_abort(true);
然后冲洗掉一些文本。
echo "Thats all folks!";
flush();
现在,我怎么可以欺骗浏览器,使其认为该HTTP请求了吗? 这样我就可以继续做我自己的工作,而不显示“页面加载”浏览器。
header(??) // something like this?
我首先配置我的脚本甚至可以运行后HTTP请求结束
ignore_user_abort(true);
然后冲洗掉一些文本。
echo "Thats all folks!";
flush();
现在,我怎么可以欺骗浏览器,使其认为该HTTP请求了吗? 这样我就可以继续做我自己的工作,而不显示“页面加载”浏览器。
header(??) // something like this?
以下是如何做到这一点。 你告诉浏览器输出的第N个字符阅读,然后关闭连接,而你的脚本保持运行,直到它完成。
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Will not work
flush(); // Unless both are called !
// At this point, the browser has closed connection to the web server
// Do processing here
echo('Text user will never see');
?>
头是不行的(他们是头,所以他们先来)
我不知道有什么方法来关闭而不终止该脚本的HTTP连接,虽然我想有这样做的一些模糊的方式。
告诉我们你想要的请求完成后,将帮助我们提供更好的建议做什么。
但是总体来说,我会考虑下列之一:
1)执行一些简单的命令行脚本(使用EXEC()),看起来像:
#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &
然后踢的关从喜欢你的HTTP绑定脚本:
<?PHP
exec('/path/to/my/script.sh');
?>
要么:
2)写另一个程序(可能连续运行的后台程序,或者只是一些脚本正在不断cronned经常),并找出你的请求的代码如何传递指令。 可能您排队的工作数据库表,或试图使其与某种类型的平面文件的工作。 你也可以有你的基于Web的脚本调用,导致外的请求,你的脚本排队一些工作,一些命令行命令。
在这一天结束时,你不希望你的脚本保持HTTP请求后执行。 假设你正在使用mod_php的,这意味着,直到脚本结束,你会被占压的Apache进程。
也许php.net手册页在这个特别的评论将帮助: http://www.php.net/manual/en/features.connection-handling.php#71172
理论上,如果HTTP 1.1保持活动已启用,客户端接收字符的从服务器预计量,应该把它作为响应的结束和继续呈现网页(同时保持连接仍处于打开状态。)尝试发送这些报头(如果你不能让他们另一种方式):
Connection: keep-alive Content-Length: n
其中n
的是,您在响应体发送的字符数(输出缓冲可以帮你算这一点。)我很抱歉,我没有测试了这一点自己的时间。 我只是扔在的情况下,它的工作建议。
做到这一点,最好的方法是使用输出缓冲。 PHP发送头当它准备好了,但如果你换你的输出到浏览器与ob_ *您可以控制头的每一步。
您可以在缓冲区举行一个渲染页面,如果你想和,直到太阳在中国出现发送头。 这种做法就是为什么你会看到很多开放的<?php
标签,但现在没有结束标记。 它使脚本提前发送任何标题,因为可能存在一些包括考虑。