PHP 像 $_POST 这样的超全局变量如何被 HTML 表单填充?

How do PHP superglobals like $_POST get populated by an HTML form?

我知道如果我创建一个 html 表单并将 action 属性设置为 PHP 脚本,我可以通过超级全局 $_[=25 访问 POST 数据=].我的问题是这是怎么发生的?

如果我有这样一个简单的表格:

<form action="script.php" method="POST">
  <input type="text" name="fname">
  <input type="submit" value="Submit">
</form>

还有一个像这样的简单脚本:

<?php
    echo $_POST["name"];
?>

什么机制将来自 POST 请求的原始表单数据带入 PHP?是否有某种 CGI 脚本?另一种语言的等价物是什么,比如 Ruby?

An associative array of variables passed to the current script via the HTTP POST method when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request.

$HTTP_POST_VARS contains the same initial information, but is not a superglobal. (Note that $HTTP_POST_VARS and $_POST are different variables and that PHP handles them as such)

https://www.php.net/manual/en/reserved.variables.post.php

它只是一个超级全局变量,PHP 解释器将所有 post 数据存储在其中,直到清除它的下一个请求。

当您通过浏览器提交表单时,浏览器将获取数据并将其序列化,然后在 HTTP/HTTPS 请求中将其发送到 Web 服务器。
对于 GET 表单,数据被序列化并附加到 URL 中的字符串查询,例如 myphp.php?field1=foo&field2=bar
对于 POST 数据,它被插入到请求的正文中。

基于请求的类型 PHP 引擎随后将解析接收到的数据,为了您的方便,url 对其进行解码并用它填充超全局变量。在上面的例子中,数据将是这样的:

$_GET = [
    'field1' => 'foo',
    'field2' => 'bar'
];

这是 PHP 的一个很好的特性,与 PERL 之类的语言相比,后者强制您自己解析输入数据。

Additionally PHP offers a way to read the input stream directly for the raw data which you would normally receive.