ZetCode

PHP curl_share_init 函数

最后修改日期:2025 年 4 月 11 日

PHP curl_share_init 函数创建一个共享的 cURL 句柄。它允许多个 cURL 句柄共享数据,如 cookie 和 DNS 缓存。当向同一服务器发出多个请求时,这可以提高性能。

基本定义

curl_share_init 函数初始化一个共享的 cURL 句柄。它返回一个可以与 curl_share_setopt 一起使用的资源。共享句柄有助于减少发出相似请求时的开销。

语法:curl_share_init(): CurlShareHandle|false。该函数返回一个共享句柄,如果失败则返回 FALSE。完成后务必使用 curl_share_close() 清理。

基本共享句柄示例

此示例演示了为两个 cURL 请求创建基本共享句柄。

basic_share.php
<?php

declare(strict_types=1);

$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);

$ch1 = curl_init("https://example.com/api1");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

$ch2 = curl_init("https://example.com/api2");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

$result1 = curl_exec($ch1);
$result2 = curl_exec($ch2);

curl_close($ch1);
curl_close($ch2);
curl_share_close($sh);

我们创建一个共享句柄并配置它来共享 cookie。两个 cURL 句柄都使用相同的共享句柄。这允许它们在请求之间共享 cookie 数据。完成后务必关闭所有句柄。

共享 DNS 缓存

此示例展示了如何在多个 cURL 句柄之间共享 DNS 缓存。

dns_cache.php
<?php

declare(strict_types=1);

$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

$ch1 = curl_init("https://api.example.com/users");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

$ch2 = curl_init("https://api.example.com/posts");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

$response1 = curl_exec($ch1);
$response2 = curl_exec($ch2);

curl_close($ch1);
curl_close($ch2);
curl_share_close($sh);

我们将共享句柄配置为共享 DNS 缓存。对同一域的两个请求都将受益于缓存的 DNS 查询。这减少了对同一服务器的后续请求的延迟。

共享 SSL 会话数据

此示例演示了在请求之间共享 SSL 会话数据。

ssl_session.php
<?php

declare(strict_types=1);

$sh = curl_share_init();
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);

$login = curl_exec($ch1);
$profile = curl_exec($ch2);

curl_close($ch1);
curl_close($ch2);
curl_share_close($sh);

我们在对同一安全域的请求之间共享 SSL 会话数据。这避免了后续请求的冗余 SSL 握手。对于需要多个身份验证请求的 API 尤其有用。

共享多种数据类型

此示例展示了如何在句柄之间共享多种数据类型。

multiple_share.php
<?php

declare(strict_types=1);

$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE | CURL_LOCK_DATA_DNS | CURL_LOCK_DATA_SSL_SESSION);

$ch1 = curl_init("https://api.example.com/auth");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

$ch2 = curl_init("https://api.example.com/data");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

$auth = curl_exec($ch1);
$data = curl_exec($ch2);

curl_close($ch1);
curl_close($ch2);
curl_share_close($sh);

我们在请求之间共享 cookie、DNS 缓存和 SSL 会话数据。按位或运算符组合了多个共享选项。这为相关请求提供了最大的性能优势。

共享句柄的错误处理

此示例演示了在使用共享句柄时进行适当的错误处理。

error_handling.php
<?php

declare(strict_types=1);

$sh = curl_share_init();

if ($sh === false) {
    die("Failed to initialize shared handle");
}

if (!curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE)) {
    die("Failed to set share option");
}

$ch1 = curl_init("https://api.example.com/endpoint1");
if ($ch1 === false) {
    die("Failed to initialize cURL handle 1");
}

curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch1);

if ($result === false) {
    echo "cURL Error: " . curl_error($ch1);
} else {
    echo $result;
}

curl_close($ch1);
curl_share_close($sh);

我们实现了共享句柄创建和配置的全面错误检查。在继续之前验证每个步骤。这确保了生产环境中健壮的错误处理。

最佳实践

来源

PHP curl_share_init 文档

本教程通过实际示例介绍了 PHP curl_share_init 函数,展示了其在优化多个 cURL 请求方面的用法。

作者

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

所有 PHP cURL 教程列表。