关闭 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_functionhttp://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的会话处理函数session

如果该函数应该杀死 PHP,您如何使用 PHPUnit 来测试该函数?

如何在 PHP 的 GD 库中为文本添加发光或阴影? [关闭]

将 Postman 请求转换为 guzzle 或其他 PHP HTTP 客户端

怎么通过PHP来支持FTP和HTTP上传