ZetCode

PHP curl_share_setopt 函数

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

PHP curl_share_setopt 函数用于设置 cURL 共享句柄的选项。它允许多个 cURL 句柄共享数据,如 cookies 和 DNS 缓存。这在向同一服务器发出多个请求时可以提高性能。

基本定义

curl_share_setopt 函数配置一个共享的 cURL 句柄。它接受三个参数:共享句柄、要设置的选项以及值。成功时函数返回 TRUE,失败时返回 FALSE。

语法:curl_share_setopt(CurlShareHandle $share_handle, int $option, mixed $value): bool。共享句柄必须使用 curl_share_init() 创建。始终使用 curl_share_close() 进行清理。

共享 DNS 缓存

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

share_dns.php
<?php

declare(strict_types=1);

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

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

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

$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

do {
    curl_multi_exec($mh, $running);
} while ($running > 0);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_share_close($sh);

我们创建一个共享句柄并将其配置为共享 DNS 缓存。然后将两个 cURL 句柄与此共享句柄关联。 DNS 解析仅执行一次,并缓存以供后续请求使用。

共享 Cookies

此示例显示了如何在多个 cURL 会话之间共享 cookies。

share_cookies.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/login");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");

$response = curl_exec($ch1);
curl_close($ch1);

$ch2 = curl_init("https://example.com/profile");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");

$response = curl_exec($ch2);
curl_close($ch2);

curl_share_close($sh);

我们将共享句柄配置为共享 cookies。第一个请求将 cookies 存储在文件中,第二个请求使用这些 cookies。这在请求之间维护会话状态。

共享 SSL 会话

此示例演示了共享 SSL 会话数据以提高 HTTPS 性能。

share_ssl.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/api1");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

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

$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

do {
    curl_multi_exec($mh, $running);
} while ($running > 0);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_share_close($sh);

我们在对同一服务器的两个 HTTPS 请求之间共享 SSL 会话数据。这避免了为后续连接重复 SSL 握手。它显著提高了对多个 HTTPS 请求的性能。

多个共享资源

此示例展示了如何同时共享多种类型的数据。

multiple_share.php
<?php

declare(strict_types=1);

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

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

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

$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

do {
    curl_multi_exec($mh, $running);
} while ($running > 0);

curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_share_close($sh);

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

错误处理

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

error_handling.php
<?php

declare(strict_types=1);

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

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

$ch = curl_init("https://example.com");
if ($ch === false) {
    curl_share_close($sh);
    die("Failed to initialize cURL handle");
}

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

$response = curl_exec($ch);
if ($response === false) {
    echo "cURL Error: " . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);
curl_share_close($sh);

我们对所有 cURL 操作实施全面的错误检查。检查每个函数调用,并妥善清理资源。这可以防止内存泄漏并提供更好的调试信息。

最佳实践

来源

PHP curl_share_setopt 文档

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

作者

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

所有 PHP cURL 教程列表。