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 句柄的基本副本。
<?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
进行复制。两个句柄都独立执行。每个句柄在不再需要时都必须单独关闭。
修改复制的句柄
本示例展示了如何在复制的句柄上修改选项。
<?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 请求配置的句柄。
<?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 配置,但我们更改了正在发送的数据。这对于具有类似请求的批量操作很有用。
复制句柄的错误处理
本示例展示了使用复制句柄时的正确错误处理。
<?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。每个句柄的错误都会被独立处理。这显示了复制句柄之间的隔离。
性能比较
本示例比较了创建新句柄与复制现有句柄。
<?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
函数,展示了它在高效 cURL 句柄管理方面的用法。