php - 在代码执行之前发送HTTP状态

时间:2012-12-17 16:18:03

标签: php http http-headers

我希望在PHP脚本中执行其余代码之前将http状态(200 OK)发送到调用脚本。为了发送状态代码,我正在使用HTTP / 1.1 200 OK,但它在整个脚本执行完毕后发送状态,这使得调用脚本等待。我不确定这是否可能。有什么帮助吗?

详细说:我说有两个脚本,a.php和b.php。 a.php正在调用b.php并等待一个http状态,如果它是200,那么它继续做其他事情。我希望b.php脚本是这样的,一旦调用它,它就会发回200响应,然后继续使用自己的代码。

谢谢!

编辑: 阅读评论后,我明白我想做的是一个坏主意。但是,让我说出为什么我在思考它并且可以做到这样的事情。

a.php将有一个网络界面,人们可以上传他们的图像,上传完成后a.php调用b.php,它使用这些图像进行一些处理。我想a.php继续而不是挂起/等待b.php完成,如果b.php失败,我想我可以“推”一个错误,以便a.php可以提示用户有关失败。应该使用不同的线程吗?

6 个答案:

答案 0 :(得分:2)

我正在考虑使用AJAX或XMLRPC,但正如@Andrew所说,php不是那样的工作..NodeJS确实是一个不错的选择......

答案 1 :(得分:1)

嗯,听起来你可能会更好地使用允许基于套接字连接的东西。查看NodeJS。我认为PHP也可能支持某种形式的基于套接字的连接。你用“冲洗”试图做的事实上是非常糟糕的做法。 PHP不是为多个有效负载而设计的,如果你使用的是AJAX,你将会遇到很多问题。

答案 2 :(得分:1)

PHP当然可以做到,但这有点棘手。

ignore_user_abort(true);
header("Content-Length: 0");
header("Connection: Close");
flush();
session_write_close();

// do something that takes very long

这是您需要的最少代码。如果你没有会话,你可以不再打电话。

关闭连接后,您无法发送更新,因此如果您想对错误报告执行某些操作,则必须找到其他方法。

答案 3 :(得分:0)

你有像flush()这样的功能可以满足您的需要但有一些注意事项。阅读更多信息:http://php.net/manual/en/function.flush.php

由于您在代码中调用PHP脚本,因此您不必担心列出的浏览器问题。但是如果启用mod_gzip之类的东西,那就不可能了。

答案 4 :(得分:0)

如果你的a.php希望b.php异步运行,你可以考虑使用cURL POST方法来启动脚本。 a.php可以将超时设置为1秒,并且cURL会话将停止。并且b.php将继续运行,而a.php也会继续运行。

答案 5 :(得分:0)

  

a.php正在调用b.php并等待http状态,如果它是200,那么它继续做其他事情

简短的回答是,您无法控制网络服务器何时刷新缓冲区。因此,您需要绕过Web服务器来调用b.php。问题是,如果你通过exec / system / etc调用它,那么如果b.php需要花费任何时间来完成,b.hpp就会成为a.php - which is a really bad idea的子进程。

鉴于您需要采取完全不同的方法来实现问题的解决方案,了解为什么您希望它在之前发出无条件200状态是非常重要的>它做了任何有用的工作(当它最有可能失败,而它正在做有用的工作)。

根据您提供的信息(这不是很多),实现这一点的唯一可靠方法是通过消息队列(以及在守护程序中运行的自定义订阅者) - 假设您可以替换成功的入队恢复状态代码的操作。但这有其自身的复杂性。