php 8.4 已于 11 月发布,您和您的团队无疑一直在努力理解该语言最新版本所带来的新功能、弃用和更改。这包括对非 POST http 动词的更改。 在这篇博客中,我将介绍 PHP 中 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 以限制它将解析的文件上传和表单数据变量的组合。