PHP curl_share_init_persistent 函数
最后修改日期:2025 年 4 月 11 日
PHP curl_share_init_persistent
函数创建一个持久化的共享 cURL 句柄。它允许多个 cURL 句柄在请求之间共享数据,如 cookie 和 DNS 缓存。这可以提高重复请求的性能。
基本定义
curl_share_init_persistent
函数初始化一个持久化的共享 cURL 句柄。成功时返回一个 cURL 共享句柄资源。
语法:curl_share_init_persistent(string $name): CurlShareHandle
。$name 参数用于标识持久化句柄。以后可以使用相同的名称检索该句柄。
基本共享句柄示例
此示例演示了如何创建和使用基本的共享 cURL 句柄。
<?php declare(strict_types=1); // Create or retrieve persistent shared handle $sh = curl_share_init_persistent('my_shared_handle'); // Configure what to share curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); // Create regular cURL handles $ch1 = curl_init('https://example.com/api1'); $ch2 = curl_init('https://example.com/api2'); // Attach shared handle curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_SHARE, $sh); // Execute requests $result1 = curl_exec($ch1); $result2 = curl_exec($ch2); // Cleanup curl_close($ch1); curl_close($ch2);
此代码创建了一个名为 'my_shared_handle' 的持久化共享句柄。它在两次 cURL 请求之间共享 cookie 和 DNS 缓存。该共享句柄将可用于将来的请求。
共享 SSL 会话数据
此示例演示了如何在请求之间共享 SSL 会话数据。
<?php declare(strict_types=1); $sh = curl_share_init_persistent('ssl_shared'); // Share SSL session data to reuse SSL handshake curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); $ch1 = curl_init('https://secure.example.com/login'); curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $ch2 = curl_init('https://secure.example.com/profile'); curl_setopt($ch2, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); // Execute requests - SSL session will be reused $login = curl_exec($ch1); $profile = curl_exec($ch2); curl_close($ch1); curl_close($ch2);
我们共享 SSL 会话数据以避免重复 SSL 握手。这显著提高了到同一服务器的 HTTPS 请求的性能。共享句柄存储 SSL 会话信息。
跨请求的持久化句柄
此示例演示了如何在多个 HTTP 请求中使用相同的持久化句柄。
<?php declare(strict_types=1); // First request function firstRequest() { $sh = curl_share_init_persistent('cross_request_handle'); curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); $ch = curl_init('https://example.com/set-cookie'); curl_setopt($ch, CURLOPT_SHARE, $sh); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Second request function secondRequest() { // Retrieve same shared handle $sh = curl_share_init_persistent('cross_request_handle'); $ch = curl_init('https://example.com/use-cookie'); curl_setopt($ch, CURLOPT_SHARE, $sh); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return $response; } // Execute requests $first = firstRequest(); $second = secondRequest();
在两次独立的 HTTP 请求中使用了相同的持久化共享句柄。在第一个请求中设置的 cookie 在第二个请求中可用。该句柄由名称 'cross_request_handle' 标识。
多线程共享处理
此示例展示了持久化共享句柄的线程安全用法。
<?php declare(strict_types=1); // Worker function for threads function fetchUrl($url) { $sh = curl_share_init_persistent('threaded_shared'); curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); $ch = curl_init($url); curl_setopt($ch, CURLOPT_SHARE, $sh); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); return $result; } // Create multiple threads $threads = []; $urls = [ 'https://example.com/page1', 'https://example.com/page2', 'https://example.com/page3' ]; foreach ($urls as $url) { $thread = new Thread('fetchUrl', $url); $threads[] = $thread; $thread->start(); } // Wait for threads to complete foreach ($threads as $thread) { $thread->join(); }
多个线程安全地使用相同的持久化共享句柄。DNS 缓存由所有线程共享,减少了 DNS 查询。正确配置后,该句柄是线程安全的。
高级共享选项
此示例演示了共享句柄的高级配置选项。
<?php declare(strict_types=1); $sh = curl_share_init_persistent('advanced_handle'); // Share multiple data types curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); // Set user-defined data curl_share_setopt($sh, CURLSHOPT_USERDATA, ['app' => 'MyCrawler']); // Cleanup function when handle is closed curl_share_setopt($sh, CURLSHOPT_UNSHARE, function($handle) { echo "Cleaning up shared handle\n"; }); $ch1 = curl_init('https://api.example.com/v1'); curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $ch2 = curl_init('https://api.example.com/v2'); curl_setopt($ch2, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); $results = [ curl_exec($ch1), curl_exec($ch2) ]; curl_close($ch1); curl_close($ch2);
此示例配置了多个共享数据类型并添加了高级选项。我们设置了用户数据和清理回调。共享句柄有效地管理两个 API 请求之间的资源。
最佳实践
- 命名:为持久化句柄使用描述性名称。
- 清理:不再需要句柄时显式关闭它们。
- 线程安全:在线程中仔细配置共享选项。
- 资源限制:监控多个句柄的内存使用情况。
- 错误处理:检查句柄创建失败。
来源
PHP curl_share_init_persistent 文档
本教程涵盖了 PHP curl_share_init_persistent
函数,并提供了实际示例,展示了如何有效地使用它进行 HTTP 请求。