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 请求。