ZetCode

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 句柄。

basic_shared.php
<?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 会话数据。

ssl_shared.php
<?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 请求中使用相同的持久化句柄。

persistent_across_requests.php
<?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' 标识。

多线程共享处理

此示例展示了持久化共享句柄的线程安全用法。

threaded_shared.php
<?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 查询。正确配置后,该句柄是线程安全的。

高级共享选项

此示例演示了共享句柄的高级配置选项。

advanced_shared.php
<?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 请求。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

所有 PHP cURL 教程列表。