也许是一个愚蠢的问题,但我不知道 PHP 在这个意义上是如何工作的。
假设您从 JavaScript 客户端向 PHP 后端发出 HTTP 请求。在 PHP 的服务器端,您可以执行以下操作:
// validate input
// process input
header(...);
// execute internal API request, from this server in PHP, using guzzle,
// curl or whatever, to an external API, and wait for the response
...
echo $response;
换句话说,在执行内部 API 请求之前调用
header()
时,HTTP 标头是否发送到外部 API,并在最终响应中丢失/未转发到 JavaScript 客户端?
这取决于 PHP 和 Web 服务器的配置方式,特别是关于输出/响应缓冲。
严格针对 PHP:
output_buffering
,则整个请求必须在 any 响应(包括 HTTP 标头)返回到客户端之前完成。output_buffering
,则在生成非标头输出后立即发出 HTTP 标头。之后尝试设置另一个标头会导致经典的“标头已发送”错误。当然,需要注意的是,可以使用 userland code 启用/禁用/刷新/清除缓冲,这进一步使问题变得混乱。
之后,由 HTTP 服务器决定要做什么,但通常默认情况是立即转发标头并在一定程度上缓冲输出,以免发送许多小数据包,而很少有较大的数据包就足够了。