关闭 PHP HTTP 请求然后运行函数? [复制]
Posted
技术标签:
【中文标题】关闭 PHP HTTP 请求然后运行函数? [复制]【英文标题】:Close PHP HTTP request and then run function? [duplicate] 【发布时间】:2012-03-07 04:28:20 【问题描述】:可能重复:close a connection early
我希望完成一些类似的事情:
-
用户请求
foo.html
页面启动 TCPIP 套接字和 HTTP 会话,回显请求头信息
页面回显文件的内容
页面关闭套接字,用户有文件,大家都很高兴,没有更多的 HTTP 事务进行。
函数 FooBar() 被调用...添加数字、发送电子邮件、更新数据库或其他不会阻止向用户输出页面的任务。
在概念上,我的伪 php 代码可能如下所示:
<?php
//Send content to the user
echo "Hello world!!";
//This terminates the script,
//I simply want to close the
//HTTP part without terminating
exit();
//That only took a few milliseconds
//Send an email to someone
//containing a sum of numbers
//in the Fibonacci sequence
//This task might take minutes to do.
mail(
"foo@example.com",
"Your sum is ready",
fibonacci(100)
);
但是我没有看到明确的方法来执行此操作,因为 exit() 会终止脚本,并且我没有看到任何可以让我控制 HTTP 套接字的方法。
我见过close a connection early,这是一个有趣的答案,但是我希望在 PHP 5.3 中实现这一点,而不需要输出缓冲和刷新。
【问题讨论】:
应该将可能需要几分钟的事情委派给作业队列。让脚本定期检查队列并处理等待的内容。 【参考方案1】:查看register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
【讨论】:
那又如何呢?这似乎是指向手册的无用链接。在这里给出一些你自己的想法经验。 为什么? OP 询问手册的描述:“注册一个回调以在脚本执行完成或调用 exit() 后执行。” 所以编辑你的答案并放一个例子。) 再说一遍,为什么?手册有一个例子。手册的存在是有原因的;供参考。我没有理由从该页面中取出任何内容并将其放在这里,这无助于 OP 完全理解该功能的作用。 @AndrewEllis 仅发布链接不是 *** 定义的答案,这就是原因。【参考方案2】:正如 Timbo White 在 this question 中回答的那样(与我实际使用的代码非常相似,所以我知道它有效)试试这个:
// buffer all upcoming output
ob_start();
// get the size of the output
$size = ob_get_length();
// send headers to tell the browser to close the connection
header("Content-Length: $size");
header('Connection: close');
// flush all output
ob_end_flush();
ob_flush();
flush();
//now you can do anything down here no matter how long it takes
//because the script appears to have returned to the user.
【讨论】:
ignore_user_abort(true)
不应该也在吗? (你想要 +10 代表,找出来,你会得到它)
所以事实证明它不是必须的。 ignore_user_abort(true) 在运行长脚本时很有用,如果您不希望用户能够停止进度(或者即使用户愿意等待,浏览器也会超时)但是因为我们从浏览器返回这里从观点来看,浏览器无论如何都不能中断,所以你不需要它,但拥有它不会有任何伤害。以上是关于关闭 PHP HTTP 请求然后运行函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
PHP time() 有时会关闭几秒钟,然后在下次调用时更正
如果该函数应该杀死 PHP,您如何使用 PHPUnit 来测试该函数?
如何在 PHP 的 GD 库中为文本添加发光或阴影? [关闭]