ZetCode

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 获取数据。

basic_get.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);

$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 请求。

post_request.php
<?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 响应。

json_response.php
<?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 标头。

custom_headers.php
<?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 证书验证。

ssl_verification.php
<?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 检查主机名。对于生产环境,请始终使用适当的证书验证。

最佳实践

来源

PHP curl_exec 文档

本教程通过实际示例介绍了 PHP curl_exec 函数,展示了其在各种 HTTP 请求场景中的用法。

作者

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

所有 PHP cURL 教程列表。