PHP curl_upkeep
函数
最后修改日期:2025 年 4 月 11 日
PHP curl_upkeep
函数对 cURL 句柄执行连接维护检查。它通过检查 HTTP/2 连接的健康状况来帮助维护持久的 HTTP/2 连接。此函数随 cURL 7.62.0 在 PHP 7.3.0 中引入。
基本定义
curl_upkeep
函数检查 HTTP/2 连接的健康状况。成功时返回 TRUE,失败时返回 FALSE。该函数将 cURL 句柄作为其唯一参数。
语法:curl_upkeep(CurlHandle $handle): bool
。句柄必须是活动的 HTTP/2 连接。此函数有助于防止长期 HTTP/2 连接的连接超时。
基本连接维护
本示例演示了使用 HTTP/2 连接进行 curl_upkeep 的基本用法。
<?php declare(strict_types=1); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://http2.golang.org/"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Initial request curl_exec($ch); // Perform connection upkeep if (curl_upkeep($ch)) { echo "Connection is healthy\n"; } else { echo "Connection check failed: " . curl_error($ch) . "\n"; } curl_close($ch);
此代码建立 HTTP/2 连接并执行健康检查。curl_upkeep
调用验证连接是否仍然活动。请注意,HTTP/2 服务器支持对于此功能正常工作是必需的。
带维护的持久连接
本示例展示了如何通过定期维护来保持持久连接。
<?php declare(strict_types=1); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://http2.golang.org/"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Initial request $response = curl_exec($ch); echo "Initial request: " . substr($response, 0, 50) . "...\n"; // Wait 30 seconds sleep(30); // Perform upkeep before next request if (curl_upkeep($ch)) { $response = curl_exec($ch); echo "Second request: " . substr($response, 0, 50) . "...\n"; } else { echo "Connection lost, need to reinitialize\n"; } curl_close($ch);
我们使用 curl_upkeep
在请求之间维护连接。这对于向同一服务器发出多个请求的应用程序很有用。维护检查有助于避免请求之间的连接超时。
带错误处理的连接维护
本示例演示了 curl_upkeep 的正确错误处理。
<?php declare(strict_types=1); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://http2.golang.org/"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Initial request curl_exec($ch); // Simulate network issue by changing timeout curl_setopt($ch, CURLOPT_TIMEOUT, 1); // Perform upkeep with error handling $upkeepResult = curl_upkeep($ch); if ($upkeepResult === false) { $errno = curl_errno($ch); $error = curl_error($ch); echo "Upkeep failed (errno $errno): $error\n"; // Reinitialize connection if needed curl_close($ch); $ch = curl_init(); // ... reinitialize options ... } else { echo "Connection is healthy\n"; } curl_close($ch);
我们演示了如何处理潜在的维护故障。代码检查返回值并在维护失败时检查错误详细信息。这种模式对于生产应用程序中健壮的连接管理非常重要。
连接池中的维护
本示例展示了如何使用 curl_upkeep 管理多个连接。
<?php declare(strict_types=1); // Initialize multiple HTTP/2 connections $connections = []; $urls = [ "https://http2.golang.org/", "https://http2.akamai.com/", "https://nghttp2.org/" ]; foreach ($urls as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); // Establish connection $connections[] = $ch; } // Periodically check all connections foreach ($connections as $i => $ch) { echo "Checking connection $i: "; if (curl_upkeep($ch)) { echo "OK\n"; } else { echo "FAILED - " . curl_error($ch) . "\n"; // Mark for reinitialization unset($connections[$i]); curl_close($ch); } } // Clean up remaining connections foreach ($connections as $ch) { curl_close($ch); }
此示例维护多个 HTTP/2 连接并检查其健康状况。代码演示了如何通过定期维护检查来管理连接池。失败的连接会从池中移除并妥善关闭。
带自定义间隔的维护
本示例根据连接年龄实现了自定义维护间隔。
<?php declare(strict_types=1); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://http2.golang.org/"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $lastUsed = time(); $connectionAge = 0; // Main application loop for ($i = 0; $i < 5; $i++) { // Perform request $response = curl_exec($ch); echo "Request $i: " . substr($response, 0, 20) . "...\n"; // Update last used time $lastUsed = time(); // Wait random time (simulate application work) $waitTime = rand(10, 30); sleep($waitTime); // Calculate connection age $connectionAge = time() - $lastUsed; // Perform upkeep if connection is idle if ($connectionAge > 15) { echo "Performing upkeep (idle for $connectionAge seconds)\n"; if (!curl_upkeep($ch)) { echo "Upkeep failed, reinitializing connection\n"; curl_close($ch); $ch = curl_init(); // Reinitialize options... $lastUsed = time(); } } } curl_close($ch);
此代码实现了基于连接空闲时间的自定义维护策略。只有当连接空闲超过 15 秒时才会执行维护。此方法通过最大限度地减少不必要的维护检查来优化性能。
最佳实践
- 仅限 HTTP/2: curl_upkeep 仅适用于 HTTP/2 连接。
- 错误处理: 始终检查 curl_upkeep 的返回值。
- 时机: 在空闲时段进行维护,而不是在请求期间。
- 重新初始化: 准备好重新创建失败的连接。
- 测试: 验证服务器对 HTTP/2 和连接维护的支持。
来源
本教程介绍了 PHP curl_upkeep
函数,并通过实际示例展示了其在维护 HTTP/2 连接方面的用法。适当的连接管理可以显著提高 HTTP/2 应用程序的性能。