首页 / PHP 入门教程 / PHP cURL

PHP 入门教程

PHP cURL

本教程共 65 篇 · 第 35 篇 · 更新于 2026-07-24 · 约 5 分钟阅读

PHPPHP8cURLHTTP请求API调用Guzzle

35. PHP cURL

本节目标:学会用 cURL 发起 HTTP 请求,掌握 GET/POST、设置请求头和处理响应的方法。

cURL 是 PHP 最强大的 HTTP 客户端。调用 API、抓取网页、上传文件,它都能胜任。

35.1 cURL 基础流程

所有 cURL 请求都遵循”初始化 -> 设置选项 -> 执行 -> 关闭”四步:

<?php
// 1. 初始化
$ch = curl_init();

// 2. 设置选项
curl_setopt($ch, CURLOPT_URL, "https://api.github.com/users/php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回字符串而非直接输出

// 3. 执行
$response = curl_exec($ch);

// 4. 检查错误
if ($response === false) {
    echo "cURL 错误:" . curl_error($ch);
} else {
    echo $response;
}

// 5. 关闭
curl_close($ch);
Note

CURLOPT_RETURNTRANSFER 一定要设为 true,否则响应会直接输出到浏览器,无法赋值给变量。

35.2 发起 GET 请求

<?php
function httpGet(string $url, array $headers = []): string {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);          // 超时时间
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 验证 SSL 证书

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 200) {
        throw new Exception("HTTP 状态码:{$httpCode}");
    }

    return $response;
}

// 调用示例
$data = httpGet("https://api.example.com/users");
$users = json_decode($data, true);

35.3 发起 POST 请求

POST JSON 数据

<?php
function httpPost(string $url, array $data, array $headers = []): string {
    $ch = curl_init();

    $json     = json_encode($data);
    $headers  = array_merge([
        "Content-Type: application/json",
        "Content-Length: " . strlen($json),
    ], $headers);

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
}

// 调用示例
$result = httpPost("https://api.example.com/login", [
    "username" => "admin",
    "password" => "secret123",
]);

POST 表单数据

<?php
$ch = curl_init();

$postData = [
    "name"  => "张三",
    "email" => "zhangsan@example.com",
];

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/form");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);
Tip

http_build_query() 把数组转为 name=value&name2=value2 格式,并自动做 URL 编码。

35.4 常用选项速查

选项作用
CURLOPT_URL请求地址
CURLOPT_RETURNTRANSFER返回响应字符串
CURLOPT_POST使用 POST 方法
CURLOPT_POSTFIELDSPOST 数据
CURLOPT_HTTPHEADER自定义请求头数组
CURLOPT_FOLLOWLOCATION跟随 3xx 重定向
CURLOPT_TIMEOUT超时秒数
CURLOPT_SSL_VERIFYPEER验证 SSL 证书
CURLOPT_USERAGENT设置 User-Agent

35.5 获取响应信息

<?php
$ch = curl_init("https://httpbin.org/get");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

// 获取详细的传输信息
$info = curl_getinfo($ch);
echo "HTTP 码:" . $info["http_code"] . "\n";
echo "总耗时:" . $info["total_time"] . " 秒\n";
echo "内容类型:" . ($info["content_type"] ?? "未知") . "\n";

curl_close($ch);

35.6 下载文件

<?php
$url  = "https://example.com/image.jpg";
$save = "downloads/photo.jpg";

$ch = curl_init($url);
$fp = fopen($save, "wb");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);
fclose($fp);

if ($code === 200) {
    echo "下载成功,保存为 {$save}";
} else {
    unlink($save);
    echo "下载失败,HTTP 码:{$code}";
}

35.7 封装可复用的请求类

<?php
class HttpClient {
    public static function request(
        string $method,
        string $url,
        array $data = [],
        array $headers = []
    ): array {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        if (strtoupper($method) === "POST") {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            $headers[] = "Content-Type: application/json";
        }

        if (!empty($headers)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }

        $body = curl_exec($ch);
        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $error = curl_error($ch);
        curl_close($ch);

        return [
            "code"    => $code,
            "body"    => $body,
            "error"   => $error,
            "json"    => json_decode($body, true),
        ];
    }
}

// 使用
$result = HttpClient::request("GET", "https://api.example.com/data");
if ($result["code"] === 200) {
    print_r($result["json"]);
}
Note

PHP 8.0+ 的项目也可以考虑使用 Guzzle(Composer 包),它提供了更现代化的 HTTP 客户端 API。


来源:参考了 runoob「PHP cURL 函数」、w3cschool「PHP cURL」等,改写后所得。