我首先将脚本配置为在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)编写另一个程序(可能是一个连续运行的守护程序,或者只是经常使用的一些脚本),并弄清楚你的请求代码如何传递它的指令。您可以拥有一个排队工作的数据库表,或尝试使其与某种平面文件一起使用。您也可以让基于Web的脚本调用一些命令行命令,该命令会导致您的请求外脚本排队一些工作。

在一天结束时,您不希望您的脚本在http请求后继续执行。假设您正在使用mod_php,这意味着您将绑定一个apache进程,直到脚本终止。

也许这个关于php.net手册页的特别评论会有所帮助: http://www.php.net/manual/en/features.connection-handling.php#71172

理论上,如果启用HTTP 1.1 keep-alive并且客户端从服务器接收到它所期望的字符数量,它应该将其视为响应的结束并继续呈现页面(同时保持连接仍然存在)打开。)尝试发送这些标题(如果你不能以另一种方式启用它们):

Connection: keep-alive
Content-Length: n

其中n是您在响应正文中发送的字符数量(输出缓冲可以帮助您计算。)对不起,我没有时间自己测试一下。我只是提出建议以防万一。

实现此目的的最佳方法是使用输出缓冲。 PHP在好的和准备好的时候发送标题,但是如果用ob_ *将输出包装到浏览器,你可以在每一步控制标题。

如果需要,您可以在缓冲区中保存渲染页面,并发送标题直到太阳出现在中国。这种做法就是为什么你会看到很多开放的<?php标签,但现在没有结束标签。它使脚本不会过早地发送任何头文件,因为可能需要考虑一些内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top