2024-12-24

PHP 8.4 中的 HTTP 动词变化

PHP 8.4 已于 11 月发布,您和您的团队无疑一直在努力理解该语言最新版本所带来的新功能、弃用和更改。这包括对非 POST HTTP 动词的更改。

在这篇博客中,我将介绍 PHP 中 HTTP 动词的背景,解释为什么 PHP 8.4 中的 HTTP 动词变化很重要。然后,我提供了一个指南,供开发人员在代码中实现这些更改时参考。

PHP 8.4 中的 HTTP 动词变化

PHP 中的 HTTP 动词:背景

PHP
开发时考虑到了网络,并支持其表单处理
最早的日子。最初在 HTTP 中,本质上只有两个
浏览器可以请求网页的方法:通过 GET 或 POST。
 虽然 HTML 表单仍然只真正支持这两种方法,
JavaScript 能够使用任何 HTTP 方法发送 HTTP 请求,
许多工具包(例如 HTMX)甚至可以为开发人员无缝处理此问题。

GET 和 POST HTTP 方法

GET 请求通过 URL 的查询字符串传递表单数据。
这意味着表单结果可以被添加书签、重复,甚至
缓存。因此,GET 请求通常仅用于操作
请求状态而不改变状态:搜索、结果
排序、结果过滤、分页等

如果你想执行
可能会在应用程序内进行更改的操作 – 例如,
处理购物车、发送支持消息、上传
图像等 — 您将使用 POST HTTP 方法。 POST 请求是
被认为是非幂等的,这意味着它们不能被缓存并且不应该
需要重复,因为它们有副作用。这些影响可能意味着数据库中的插入、更改或删除、文件系统操作、Web 请求或其他操作。


为了自动处理表单数据,PHP 提供了几种
它从传入请求填充的超全局变量。 $_GET 填充有 URL 查询字符串参数,并且可以从任何请求方法填充。然而,$_POST 仅由使用内容类型 application/x-www-form-urlencoded 发出的 POST 请求的正文填充,其可能如下所示:

title=HTTP Verbs Changes in PHP 8.4&url=https://example.org/blog/php-8.4-http-verbs&author=Just Some Guy&tags[0]=php&tags[1]=http
登录后复制

PHP 将接受它并填充 $_POST 超全局变量,使其变为以下内容:

<?php
$_POST = [
    'title' => 'HTTP Verbs Changes in PHP 8.4',
    'url' => 'https://example.org/blog/php-8.4-http-verbs',
    'author' => 'Just Some Guy',
    'tags' => ['php', 'http'],
];
登录后复制

PHP 确实这样做的事实这在幕后为您提供了 PHP 如此易于学习和入门的部分原因。

此外,它还可以处理内容类型 multipart/form-data,允许浏览器上传文件另外提供表单数据。当它这样做时,它将填充一个额外的 $_FILES
superglobal,提供上传文件的信息;
然后,开发人员可以在存储之前验证和预处理这些文件
它们位于永久位置。

其他 HTTP 方法

还有
比 GET 和 POST 多得多的 HTTP 方法以及 Web 开发人员
通常会想要选择不同的方法来提供上下文
他们正在尝试执行以下操作:

  • PUT 通常用于指示数据应替换现有数据。
  • PATCH 通常用于指示对现有记录的部分更新
  • DELETE 用于表示应删除或标记为提交的记录或内容已删除。

虽然浏览器本身不支持这些(还!),但许多 JavaScript 框架和库都支持。

但是
有一个问题:PHP 不会自动处理这些请求。在
事实上,你必须完全自己处理这些解析,这
当您还开始处理文件上传时,可能会出现很大的问题
以及表单数据。 (永远不要推出自己的解析器!)

对非 POST HTTP 动词的更改

PHP 8.4 引入了方法 request_parse_body():

立即学习PHP免费学习笔记(深入)”;

[$_POST, $_FILES] = request_parse_body(?array $options = null);
登录后复制

函数以一如既往的方式解析传入的请求
用于 POST 请求,但允许您指定备用变量
存储表单数据和文件上传(或覆盖超全局变量,
如果你愿意的话)。您还可以通过 $options 参数更改解析器的行为,更多信息如下。

常见模式可能是:

<?php
if (in_array($_SERVER['REQUEST_METHOD'], ['PUT', 'PATCH', 'DELETE'], true)) {
    [$_POST, $_FILES] = request_parse_body();
}
登录后复制

(尽管如果您正在使用框架,希望框架能够为您处理该细节。)

那就是
从字面上看是整个功能。提供一个简单的功能
作为 PHP 开发人员,您已经熟悉了交钥匙行为。它
没有比这更好的了!

PHP 8.4 中的 HTTP 动词:开发人员指南

现在
我们已经讨论了 PHP 8.4 中 HTTP 动词的变化,让我们
查看一些示例,了解如何使用和应用这些
代码中的更新。

支持的内容类型

就像 POST 请求一样,request_parse_body() 只会解析具有以下内容的请求类型:

  • application/x-www-form-urlencoded
  • multipart/form-data

在 application/x-www- 的情况下形式 urlencoded,$_FILES 等效
数组(返回数组中的索引 1)将为空。如果内容
不支持类型,该函数将抛出 InvalidArgumentException。

php://input

PHP 允许您通过 php://input 流检查原始请求内容。这是一个缓冲流,可以(从 PHP 7.4 开始)多次读取。但是,当接收 multipart/form-data 时
内容,PHP 变得有点破坏性,有一个很好的理由:缓冲
文件可能会导致文件内容被写入磁盘两次,
导致更多的内存、存储和 I/O 使用。

因此,request_parse_body() 不得调用两次,因为它会破坏性地消耗 php://input。

$options参数

request_parse_body() 的 $options 参数允许您在运行时更改其行为,而不是依赖于硬编码php.ini 配置。

  • 指定 post_max_size 作为它将尝试解析的最大内容大小。
  • 指定 max_input_vars 以限制它将尝试解析的表单变量数量。
  • 指定 upload_max_filesize 来限制单个文件的大小
  • 指定 max_file_uploads 以限制它将处理的文件上传数量。
  • 指定 max_multipart_body_parts 以限制它将解析的文件上传和表单数据变量的组合。

以上就是PHP 8.4 中的 HTTP 动词变化的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1156572.html

发表回复

Your email address will not be published. Required fields are marked *