ZetCode

PHP curl_copy_handle 函数

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

PHP curl_copy_handle 函数创建一个 cURL 句柄的副本。当您需要进行微小修改的类似请求时,这非常有用。复制的句柄保留了原始句柄的所有选项。

基本定义

curl_copy_handle 函数复制一个 cURL 句柄。它返回一个具有相同设置的新 cURL 句柄。两个句柄都可以独立使用。

语法:curl_copy_handle(CurlHandle $handle): CurlHandle|false。该函数接受一个参数——要复制的句柄。它返回一个新句柄,如果失败则返回 false。

基本句柄复制

本示例演示了如何创建 cURL 句柄的基本副本。

basic_copy.php
<?php

declare(strict_types=1);

$ch = curl_init("https://jsonplaceholder.typicode.com/posts/1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$ch_copy = curl_copy_handle($ch);

$response1 = curl_exec($ch);
$response2 = curl_exec($ch_copy);

echo "Original response: " . $response1 . "\n";
echo "Copied response: " . $response2;

curl_close($ch);
curl_close($ch_copy);

我们创建一个 cURL 句柄并设置其选项。然后,我们使用 curl_copy_handle 进行复制。两个句柄都独立执行。每个句柄在不再需要时都必须单独关闭。

修改复制的句柄

本示例展示了如何在复制的句柄上修改选项。

modified_copy.php
<?php

declare(strict_types=1);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$ch_copy = curl_copy_handle($ch);
curl_setopt($ch_copy, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/2");

$response1 = curl_exec($ch);
$response2 = curl_exec($ch_copy);

echo "Original (post 1): " . $response1 . "\n";
echo "Copy (post 2): " . $response2;

curl_close($ch);
curl_close($ch_copy);

我们创建一个基础句柄并复制它。然后,我们修改复制句柄中的 URL 以获取不同的资源。这表明复制的句柄可以在保留共享配置的同时进行自定义。

处理 POST 请求

本示例演示了复制为 POST 请求配置的句柄。

post_copy.php
<?php

declare(strict_types=1);

$ch = curl_init("https://jsonplaceholder.typicode.com/posts");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'title' =>  'Original Post',
    'body' =>  'Original content',
    'userId' =>  1
]);

$ch_copy = curl_copy_handle($ch);
curl_setopt($ch_copy, CURLOPT_POSTFIELDS, [
    'title' =>  'Copied Post',
    'body' =>  'Modified content',
    'userId' =>  2
]);

$response1 = curl_exec($ch);
$response2 = curl_exec($ch_copy);

echo "Original response: " . $response1 . "\n";
echo "Copied response: " . $response2;

curl_close($ch);
curl_close($ch_copy);

我们创建一个 POST 请求句柄并复制它。复制的句柄保留了 POST 配置,但我们更改了正在发送的数据。这对于具有类似请求的批量操作很有用。

复制句柄的错误处理

本示例展示了使用复制句柄时的正确错误处理。

error_handling.php
<?php

declare(strict_types=1);

$ch = curl_init("https://invalid.url.example");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);

$ch_copy = curl_copy_handle($ch);

$response1 = curl_exec($ch);
if ($response1 === false) {
    echo "Original handle error: " . curl_error($ch) . "\n";
}

curl_setopt($ch_copy, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1");
$response2 = curl_exec($ch_copy);

if ($response2 === false) {
    echo "Copied handle error: " . curl_error($ch_copy) . "\n";
} else {
    echo "Copied handle success: " . $response2;
}

curl_close($ch);
curl_close($ch_copy);

我们创建了一个带有无效 URL 的句柄并复制它。原始句柄失败,但我们修改了复制的句柄以使用有效的 URL。每个句柄的错误都会被独立处理。这显示了复制句柄之间的隔离。

性能比较

本示例比较了创建新句柄与复制现有句柄。

performance.php
<?php

declare(strict_types=1);

// Method 1: Create new handles each time
$start1 = microtime(true);
for ($i = 0; $i < 10; $i++) {
    $ch = curl_init("https://jsonplaceholder.typicode.com/posts/$i");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}
$time1 = microtime(true) - $start1;

// Method 2: Copy a base handle
$start2 = microtime(true);
$base = curl_init();
curl_setopt($base, CURLOPT_RETURNTRANSFER, true);

for ($i = 0; $i < 10; $i++) {
    $ch = curl_copy_handle($base);
    curl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/$i");
    curl_exec($ch);
    curl_close($ch);
}
curl_close($base);
$time2 = microtime(true) - $start2;

echo "New handles each time: " . $time1 . " seconds\n";
echo "Copied handles: " . $time2 . " seconds\n";
echo "Difference: " . ($time1 - $time2) . " seconds";

我们比较了进行多个类似请求的两种方法。第一种方法每次都创建新句柄。第二种方法复制一个基础句柄。对于多个类似请求,复制通常更快,因为它避免了重复的初始化。

最佳实践

来源

PHP curl_copy_handle 文档

本教程通过实际示例介绍了 PHP curl_copy_handle 函数,展示了它在高效 cURL 句柄管理方面的用法。

作者

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

所有 PHP cURL 教程列表。