如何强制 PHP 请求向客户端发送 HTTP 响应并结束请求,同时继续执行

问题描述 投票:0回答:1

我正在寻找一种方法来向发出请求的 Android 应用程序发送 HTTP 响应,并在响应终止后继续执行 PHP 脚本。 我怀疑实现这一目标的唯一方法可能是调用 fastcgi_finish_request。不过,我使用的是 mod_php 或 mod_fcgid,但不是 fastcgi。并行不是一个可行的选择,因为 Windows 和 Linux 服务器之间缺乏一致的行为,并且它会在没有大量测试和重新配置的情况下阻止更新。

一些旧的线程中提到了实现此目的的方法,但它们似乎都不适用于我的上下文(php 7.4和8.x与apache 2.4.x),客户端是一个android应用程序(浏览器确实得到了刷新的响应但请求状态保持未完成,直到整个脚本终止 - 当使用 HttpURLConnection 从 Android 应用程序发出请求时,此挂起状态处于阻塞状态,并且我没有找到在 Android 端更改此行为的方法。

作为参考,当前方法涉及使用 ob 和请求标头命令的组合,其基础依赖于:

header('Connection: close');
header('Content-Length: '.ob_get_length());
ob_end_flush();
ob_flush();
flush();
// http request should be closed now and we should be able to do some work that does not involve sending anything back to the browser

ignore_user_abort(true);
set_time_limit(0);

此方法的变体涉及人为地增加响应主体大小,因为它不会在较小的响应大小上刷新。 我已经测试了所有这些方法,但没有效果。响应将保持挂起状态,直到整个脚本终止。 此外,当使用 deflate 让 apache 发送 gzip 响应时,手动设置内容长度可能会出现问题。

有人修改了 apache 和 php 以添加一个 方法 来实现这一点,但是对于通过发行版包管理框架维护这些软件的生产环境来说,重新编译两者并不是一个可行的解决方案。

我的问题是,有没有什么方法可以使用发行版包来实现所需的结果,无论是通过 apache 配置,从 php 内部,还是在 Android 代码中? 在 Android 上重新实现整个 HTTP 请求引擎以获得低级别控制并不是解决此问题的现实方法,因为太多功能将需要太多工作(例如 ssl、deflate 和重定向)。

我只是想到了在 PHP 中使用curl 的可能性,并且超时时间非常短,可以触发对另一个脚本的调用,该脚本将执行后台工作,而无需等待答案来完成将响应发送到移动应用程序。这可能有效,但感觉像是一个肮脏的黑客,我不想以此为基础制定解决方案。

java php android http
1个回答
0
投票

您可以使用多线程与 HTTP 请求一起执行此过程。

示例:用户使用电子邮件注册。保存到数据库且另一个线程发送电子邮件进行验证时的响应状态。

© www.soinside.com 2019 - 2024. All rights reserved.