ZetCode

PHP curl_close 函数

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

PHP curl_close 函数关闭一个 cURL 会话并释放所有资源。在 PHP 中处理 cURL 时,它对于正确的资源管理至关重要。在完成请求后,请始终关闭 cURL 句柄。

基本定义

curl_close 函数终止一个 cURL 会话并释放与之相关的所有资源。该函数以 cURL 句柄作为其唯一参数,并且不返回值。

语法:curl_close(CurlHandle $handle): void。该句柄必须是通过 curl_init() 创建的有效 cURL 句柄。关闭后,该句柄不能用于新的请求。

带关闭的基本 cURL 请求

此示例演示了在简单的 GET 请求后正确关闭 cURL 句柄的方法。

basic_close.php
<?php

declare(strict_types=1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

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

curl_close($ch); // Always close the handle

此代码展示了带正确清理的基本 cURL 请求。在用完句柄后,即使发生错误,也会关闭它。这可以防止您的应用程序中出现资源泄露。

在函数中关闭

此示例展示了在使用函数时如何正确处理 cURL 清理。

function_close.php
<?php

declare(strict_types=1);

function fetchData(string $url): ?string {
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $result = curl_exec($ch);
    
    if ($result === false) {
        $error = curl_error($ch);
        curl_close($ch);
        throw new Exception("cURL error: $error");
    }
    
    curl_close($ch);
    return $result;
}

try {
    $data = fetchData("https://api.example.com/data");
    echo $data;
} catch (Exception $e) {
    echo $e->getMessage();
}

该函数创建一个 cURL 句柄,执行请求,并确保在返回前关闭该句柄。即使发生错误,该句柄也会被正确清理。此模式推荐用于可重用函数。

关闭多个句柄

此示例演示了如何处理多个 cURL 句柄并关闭它们。

multiple_close.php
<?php

declare(strict_types=1);

$handles = [];
$urls = [
    "https://api.example.com/users/1",
    "https://api.example.com/posts/1",
    "https://api.example.com/comments/1"
];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $handles[] = $ch;
}

$multiHandle = curl_multi_init();

foreach ($handles as $handle) {
    curl_multi_add_handle($multiHandle, $handle);
}

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

foreach ($handles as $handle) {
    curl_multi_remove_handle($multiHandle, $handle);
    curl_close($handle);
}

curl_multi_close($multiHandle);

此代码处理多个并发 cURL 请求。每个单独的句柄都必须在使用后关闭,以及多句柄本身。该示例在更复杂的场景中展示了正确的清理。

带错误处理的关闭

此示例演示了带资源清理的正确错误处理。

error_handling_close.php
<?php

declare(strict_types=1);

$ch = curl_init();

try {
    curl_setopt($ch, CURLOPT_URL, "https://invalid.example");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    
    $response = curl_exec($ch);
    
    if ($response === false) {
        throw new RuntimeException(
            "cURL error: " . curl_error($ch)
        );
    }
    
    echo $response;
} catch (RuntimeException $e) {
    echo "Error: " . $e->getMessage();
} finally {
    if (is_resource($ch) || $ch instanceof CurlHandle) {
        curl_close($ch);
    }
}

该示例使用 try-catch-finally 来确保即使发生异常,cURL 句柄也始终被关闭。finally 块在关闭句柄之前检查其是否有效。这是一个健壮的错误处理模式。

在面向对象的代码中关闭

此示例展示了在面向对象的环境中正确清理 cURL 句柄。

oo_close.php
<?php

declare(strict_types=1);

class ApiClient {
    private $ch;
    
    public function __construct() {
        $this->ch = curl_init();
    }
    
    public function fetch(string $url): string {
        curl_setopt($this->ch, CURLOPT_URL, $url);
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
        
        $response = curl_exec($this->ch);
        
        if ($response === false) {
            throw new RuntimeException(
                "cURL error: " . curl_error($this->ch)
            );
        }
        
        return $response;
    }
    
    public function __destruct() {
        if (isset($this->ch)) {
            curl_close($this->ch);
        }
    }
}

$client = new ApiClient();
try {
    $data = $client->fetch("https://api.example.com/data");
    echo $data;
} catch (RuntimeException $e) {
    echo $e->getMessage();
}

该类将 cURL 句柄作为实例属性进行管理。当对象被销毁时,析构函数确保句柄被关闭。此模式对于面向对象的代码中长期存在的 cURL 句柄很有用。

最佳实践

来源

PHP curl_close 文档

本教程介绍了 PHP curl_close 函数,并通过实际示例展示了在各种场景下的正确资源清理。

作者

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

所有 PHP cURL 教程列表。