我希望在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可以提示用户有关失败。应该使用不同的线程吗?
答案 0 :(得分:2)
我正在考虑使用AJAX或XMLRPC,但正如@Andrew所说,php不是那样的工作..NodeJS确实是一个不错的选择......
答案 1 :(得分:1)
答案 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状态是非常重要的>它做了任何有用的工作(当它最有可能失败,而它正在做有用的工作)。
根据您提供的信息(这不是很多),实现这一点的唯一可靠方法是通过消息队列(以及在守护程序中运行的自定义订阅者) - 假设您可以替换成功的入队恢复状态代码的操作。但这有其自身的复杂性。