0

我想在其余代码在 php 脚本中执行之前将 http 状态(200 OK)发送到调用脚本。对于发送状态码,我使用的是 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 使用这些图像进行一些处理。我希望 a.php 继续而不是挂起/等待 b.php 完成,以防 b.php 失败,我想我可能能够“推送”一个错误,以便 a.php 可以提示用户失败. 应该使用不同的线程吗?

4

6 回答 6

2

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

于 2012-12-17T16:50:45.277 回答
1

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

于 2012-12-17T16:25:06.527 回答
1

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

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

// do something that takes very long

这是您需要的最少代码。如果您没有会话,您可以取消最后一次通话。

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

于 2013-08-06T16:36:26.257 回答
0

你有这样的功能flush()做你需要的,但有一些警告。阅读更多: http: //php.net/manual/en/function.flush.php

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

于 2012-12-17T16:21:16.140 回答
0

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

于 2012-12-17T16:22:34.933 回答
0

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

简短的回答是您无法控制网络服务器何时刷新它的缓冲区。因此,您需要绕过网络服务器来调用 b.php。问题是,如果您通过 exec / system / etc 调用它,那么 b.hpp 将成为 a.php 的子进程 -如果 b.php 需要花费任何时间才能完成,这是一个非常糟糕的主意。

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

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

于 2012-12-17T16:36:29.487 回答