PHP curl_exec 函数
最后修改日期:2025 年 4 月 11 日
PHP curl_exec 函数执行一个 cURL 会话。它用于执行 HTTP 请求并从远程服务器获取数据。cURL 支持各种协议,如 HTTP、HTTPS、FTP 等。
基本定义
curl_exec 函数执行给定的 cURL 会话。它在成功时返回结果,在失败时返回 FALSE。该函数以 cURL 句柄作为其唯一参数。
语法:curl_exec(CurlHandle $handle): mixed。句柄必须使用 curl_init() 创建并在执行前配置好。使用后务必使用 curl_close() 关闭句柄。
基本的 GET 请求
此示例演示了一个简单的 GET 请求,用于从 URL 获取数据。
<?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);
$response = curl_exec($ch);
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
此代码从 JSONPlaceholder API 获取一个示例帖子。我们设置了 URL 和 RETURNTRANSFER 选项以将响应获取为字符串。包含错误处理以捕获潜在问题。
带数据的 POST 请求
此示例展示了如何发送带表单数据的 POST 请求。
<?php
declare(strict_types=1);
$ch = curl_init();
$postData = [
'title' => 'New Post',
'body' => 'This is the content',
'userId' => 1
];
curl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$response = curl_exec($ch);
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
} else {
echo "Response: " . $response;
}
curl_close($ch);
我们创建一个带表单数据的 POST 请求。CURLOPT_POST 选项设置方法,CURLOPT_POSTFIELDS 包含要发送的数据。API 以 JSON 格式返回创建的资源。
处理 JSON 响应
此示例演示了如何正确处理 JSON API 响应。
<?php
declare(strict_types=1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/users/1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json'
]);
$response = curl_exec($ch);
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
} else {
$user = json_decode($response, true);
echo "User name: " . $user['name'];
}
curl_close($ch);
我们获取一个用户对象并解码 JSON 响应。Accept 头指定我们要 JSON。解码后,我们可以将数据作为关联数组访问。
设置自定义标头
此示例展示了如何为请求设置自定义 HTTP 标头。
<?php
declare(strict_types=1);
$ch = curl_init();
$headers = [
'Authorization: Bearer abc123',
'Content-Type: application/json',
'X-Custom-Header: value'
];
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/protected");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
我们设置了多个自定义标头,包括授权令牌。标头作为数组传递给 CURLOPT_HTTPHEADER。这对于需要身份验证或特定内容类型的 API 很常见。
处理带有 SSL 验证的 HTTPS
此示例演示了 HTTPS 的正确 SSL 证书验证。
<?php
declare(strict_types=1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://secure.example.com/api");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");
$response = curl_exec($ch);
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
我们配置 cURL 来验证 SSL 证书。CURLOPT_SSL_VERIFYPEER 启用对等验证,CURLOPT_SSL_VERIFYHOST 检查主机名。对于生产环境,请始终使用适当的证书验证。
最佳实践
- 错误处理:始终检查 curl_exec 的返回值。
- 资源清理:使用 curl_close 关闭句柄。
- SSL 安全:为 HTTPS 启用验证。
- 超时:设置 CURLOPT_TIMEOUT 以避免挂起。
- 内存:对大文件下载使用 CURLOPT_FILE。
来源
本教程通过实际示例介绍了 PHP curl_exec 函数,展示了其在各种 HTTP 请求场景中的用法。