11、PHP 8.4 新特性 - cURL 扩展 setopt 新增 CURLOPT_SERVER_RESPONSE_TIMEOUT 选项

作者: 温新

图书: 【PHP 8.4 新特性】

阅读: 118

时间: 2025-01-18 10:00:56

注意:目前文档还没有更此说明,通过代码追踪可以看到这是 PHP 8.4 新增的。

在 PHP 8.4 中,cURL 扩展引入了一个新的选项 CURLOPT_SERVER_RESPONSE_TIMEOUT,并正式替换了以前的 CURLOPT_FTP_RESPONSE_TIMEOUT。这个新的选项旨在提供更加统一和一致的超时控制,特别是在处理 FTP 和其他协议的响应超时时。

此选项之前仅用于 FTP,而 cURL 随后扩展了对其他协议的支持,如 SFTP、SCP、IMAP、POP3 和 SMTP。由于它的首次使用是在 FTP 中,因此该选项被命名为 CURLOPT_FTP_RESPONSE_TIMEOUT,并且 PHP 在所有当前版本中都支持它。然而,从 libcurl 7.85 开始,为了支持新的选项 CURLOPT_SERVER_RESPONSE_TIMEOUT,旧的选项 CURLOPT_FTP_RESPONSE_TIMEOUT 被弃用了。在内部,这两个常量持有相同的整数值(112)。

这意味着:

  • 如果你正在使用较新版本的 libcurl (7.85 或更高),建议迁移到 CURLOPT_SERVER_RESPONSE_TIMEOUT 以保持代码的现代性和兼容性。
  • 尽管 CURLOPT_FTP_RESPONSE_TIMEOUT 仍然可以在现有的 PHP 版本中使用,但由于其已被标记为废弃,未来的 libcurl 版本可能会移除对该选项的支持。
  • 两个选项在功能上是等效的,只是名称和适用范围有所不同。CURLOPT_SERVER_RESPONSE_TIMEOUT 提供了一个更通用的解决方案,适用于多种协议。

PHP 8.4 及更高版本声明了一个新的常量 CURLOPT_SERVER_RESPONSE_TIMEOUT,其值与现有的 CURLOPT_FTP_RESPONSE_TIMEOUT 常量相同。使用 CURLOPT_FTP_RESPONSE_TIMEOUT 常量的现有应用程序可以继续使用它,因为它并没有被弃用。

然而,如果应用程序仅运行在 PHP 8.4 及更高版本上,建议将 CURLOPT_FTP_RESPONSE_TIMEOUT 常量的引用替换为 CURLOPT_SERVER_RESPONSE_TIMEOUT

在功能上,CURLOPT_FTP_RESPONSE_TIMEOUTCURLOPT_SERVER_RESPONSE_TIMEOUT 是相同的。

使用案例

<?php

declare(strict_types=1);

$ch = curl_init('https://qq.com');

// 设置 CURLOPT_SERVER_RESPONSE_TIMEOUT 选项
curl_setopt($ch, CURLOPT_SERVER_RESPONSE_TIMEOUT, 10); // 设置响应超时时间为10秒
// 设置其他常见的 cURL 选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

// 检查请求是否成功
if ($response === false) {
    echo "cURL 错误: " . curl_error($ch);
} else {
    echo "响应内容: " . $response;
}

curl_close($ch);

定义如下

/**
 * Time allowed to wait for FTP response.
 * @link https://curl.haxx.se/libcurl/c/CURLOPT_FTP_RESPONSE_TIMEOUT.html
 * @since 5.5
 */
define('CURLOPT_FTP_RESPONSE_TIMEOUT', 112);


/**
 * @since 8.4
 */
define('CURLOPT_SERVER_RESPONSE_TIMEOUT', 112);

向后兼容性影响

可以通过在全局命名空间中声明新的 CURLOPT_SERVER_RESPONSE_TIMEOUT 常量,将其回溯到旧版本的 PHP 中。

if (\PHP_VERSION_ID < 80400) {
    define('CURLOPT_SERVER_RESPONSE_TIMEOUT', 112);
}
请登录后再评论