编程

PHP 8.2 新特性: Curl: curl_getinfo 函数支持 CURLINFO_EFFECTIVE_METHOD

1110 2022-10-30 20:08:18

Curl 扩展提供了一个叫 curl_getinfo() 返回指定的 Curl 传输的信息。PHP 8.2 开始, curl_getinfo 函数返回请求的有效方法,这个有效方法可能与初始的请求方法不同(比如,从 HTTP POST 请求变成 GET 请求 )。

如果调用 curl_getinfo() 函数时不带参数,它会返回关于该传输的所有可用信息。在 PHP 8.2 后,返回的数组包含带有有效方法 key 的值,包含了 HTTP 请求的有效方法名。

另外,可以通过传入 CURLINFO_EFFECTIVE_METHOD 常量到 curl_getinfo() 函数中检索有效方法的值。

这一特性只有在 PHP Curl 是用 Curl v7.72.0 以上版本编译而来的情况下可行。 

用例

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://example.com');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$info = curl_getinfo($ch);
var_dump($info);
 array(38) {
   ["url"]=> string(20) "https://example.com/"
   ["content_type"]=> string(24) "text/html; charset=UTF-8"
   ["http_code"]=> int(200)
   ...
   ["total_time_us"]=> int(1029949)
+  ["effective_method"]=> string(3) "GET"
 }

当目标服务器发出重定向响应时,这个有效方法信息是有用的, Curl 配置。比如,大部分网页表单提交按照 Post-重定向-Get 模式进行,服务器会在表单提交后向同一 URL 发送重定向响应。在这种情况下,effective_method 字段会包含正确的有效方法(GET),跟初始请求方法(POST) 相反。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://example.com');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$info = curl_getinfo($ch, CURLINFO_EFFECTIVE_METHOD);
var_dump($info);
string(3) "GET"

CURLINFO_EFFECTIVE_METHOD 常量

CURLINFO_EFFECTIVE_METHOD 是 PHP 8.2 新增的常量,被赋整型值 10486234。该常量在全局命名空间中声明

向后兼容性影响

CURLINFO_EFFECTIVE_METHOD 是一个新的 PHP 常量。虽然可以补丁的方式在 PHP 旧版本中声明该常量,但是 curl_getinfo 函数不接受该参数,会返回 false

该常量和函数只对用 Curl 7.72.0 以上编译的 PHP 有效。