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

php-在代码执行之前发送HTTP状态,php,http,http-headers,Php,Http,Http Headers,我希望在php脚本中执行其余代码之前,将http状态(200OK)发送给调用脚本。对于发送状态代码,我使用HTTP/1.1 200 OK,但它在整个脚本完成执行后发送状态,这使得调用脚本等待。我甚至不确定这是否可能。有什么帮助吗 详细说明:假设我有两个脚本,a.php和b.php。a、 php正在调用b.php并等待http状态,如果它是200,那么它将继续执行其他操作。我希望b.php脚本能够在被调用后立即返回一个200响应,然后继续使用自己的代码 谢谢 编辑: 读了评论后,我明白了我想做的是

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

详细说明:假设我有两个脚本,a.php和b.php。a、 php正在调用b.php并等待http状态,如果它是200,那么它将继续执行其他操作。我希望b.php脚本能够在被调用后立即返回一个200响应,然后继续使用自己的代码

谢谢

编辑: 读了评论后,我明白了我想做的是一个坏主意。然而,让我说一下我为什么会这样想,这样的事情可以做到吗


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

您有像
flush()
这样的函数,它们可以做您需要做的事情,但有一些警告。更多信息请访问:


因为您是在代码中调用PHP脚本,所以不必担心列出的浏览器问题。但是,如果启用了mod_gzip之类的功能,这将是不可能的。

您有像
flush()
这样的函数,它们可以执行您需要的操作,但需要注意一些事项。更多信息请访问:


因为您是在代码中调用PHP脚本,所以不必担心列出的浏览器问题。但是如果启用了MODJGZIP之类的东西,这是不可能的。

< P>如果你的.PHP需要B.PHP异步运行,你可以考虑使用CURL POST方法来启动脚本。a、 php可以将超时设置为1秒,cURL会话将停止。B.PHP将继续运行,而.PHP也将继续运行。

< P>如果您的.PHP需要B.PHP异步运行,您可以考虑使用CURL POST方法启动脚本。a、 php可以将超时设置为1秒,cURL会话将停止。b.php将继续运行,而a.php也将继续运行。

嗯,听起来您最好使用允许基于套接字的连接的东西。看看NodeJS。我认为PHP可能也支持某种形式的基于套接字的连接。使用“flush”实际上是非常糟糕的做法。PHP不是为多个有效负载而设计的,如果您使用AJAX,您将遇到一系列问题。

嗯,听起来您最好使用基于套接字的连接。看看NodeJS。我认为PHP可能也支持某种形式的基于套接字的连接。使用“flush”实际上是非常糟糕的做法。PHP不是为多个有效负载而设计的,如果您使用AJAX,您将遇到一系列问题

a、 php正在调用b.php并等待http状态,如果是200,则继续执行其他操作

简而言之,您无法控制Web服务器何时刷新其缓冲区。因此,您需要绕过Web服务器来调用b.php。问题是,如果您通过exec/system/etc调用它,那么b.hpp将成为a.php的子进程——如果b.php需要任何时间来完成的话

考虑到您需要采取完全不同的策略来实现问题的解决方案,重要的是要知道为什么您希望它在执行任何有用的工作之前(当它在执行有用的工作时最有可能失败时)发出无条件的200状态

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

a、 php正在调用b.php并等待http状态,如果是200,则继续执行其他操作

简而言之,您无法控制Web服务器何时刷新其缓冲区。因此,您需要绕过Web服务器来调用b.php。问题是,如果您通过exec/system/etc调用它,那么b.hpp将成为a.php的子进程——如果b.php需要任何时间来完成的话

考虑到您需要采取完全不同的策略来实现问题的解决方案,重要的是要知道为什么您希望它在执行任何有用的工作之前(当它在执行有用的工作时最有可能失败时)发出无条件的200状态


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

我在考虑AJAX或XMLRPC,但正如@Andrew所说的,php不是那样工作的。。NodeJS确实是一个很好的选择…

我在考虑AJAX或XMLRPC,但正如@Andrew所说,php不是那样工作的。。NodeJS确实是一个很好的选择…

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

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

// do something that takes very long
这是您需要的最少代码。如果您没有会话,您可以取消最后一个呼叫


一旦你关闭了连接,你就不能发送更新,所以如果你想做一些错误报告的事情,你必须找到另一种方法。

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

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

// do something that takes very long
这是您需要的最少代码。如果您没有会话,您可以取消最后一个呼叫

一旦你关闭了连接,你就不能