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 句柄的方法。
<?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 清理。
<?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 句柄并关闭它们。
<?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 请求。每个单独的句柄都必须在使用后关闭,以及多句柄本身。该示例在更复杂的场景中展示了正确的清理。
带错误处理的关闭
此示例演示了带资源清理的正确错误处理。
<?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 句柄。
<?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 句柄很有用。
最佳实践
- 始终关闭:关闭您创建的每个 cURL 句柄。
- 错误处理:即使在发生错误后也要关闭句柄。
- 对象清理:为 OOP 代码使用析构函数。
- 多个句柄:在多请求中关闭所有句柄。
- 验证:在关闭之前检查句柄的有效性。
来源
本教程介绍了 PHP curl_close 函数,并通过实际示例展示了在各种场景下的正确资源清理。