首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP cURL 入門:三行代碼抓取遠程頁面,從初始化到關閉完整流程

     編輯:PHP 綜合知識

前言

cURL 是 PHP 中最強大、最常用的 HTTP 客戶端庫。本文以最簡潔的示例展示「初始化 → 設置選項 → 執行 → 關閉」的標準四步流程,並解釋每步作用,幫助新手快速上手。

最小可用示例

<?php
// 1. 初始化 cURL 會話,傳入目標 URL
$ch = curl_init('https://www.w3mentor.com/robots.txt');

// 2. 設置選項:CURLOPT_RETURNTRANSFER => true 使 curl_exec 返回字符串而非直接輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 3. 執行請求
$page = curl_exec($ch);

// 4. 關閉會話,釋放資源
curl_close($ch);

echo $page; // 輸出 robots.txt 內容
?>

核心選項速查表

常量作用典型值
CURLOPT_URL目標 URL(也可在 curl_init() 中傳入)字符串
CURLOPT_RETURNTRANSFER返回響應體字符串,而非直接輸出true(必設)
CURLOPT_HEADER是否在返回中包含響應頭false(默認)
CURLOPT_FOLLOWLOCATION自動跟隨 3xx 重定向true
CURLOPT_TIMEOUT最大執行秒數(連接+傳輸)10
CURLOPT_CONNECTTIMEOUT連接階段超時秒數5
CURLOPT_SSL_VERIFYPEER驗證 SSL 證書(生產環境建議 true)false(開發臨時關閉)
CURLOPT_USERAGENT自定義 User-Agent'MyBot/1.0'
CURLOPT_POST發送 POST 請求true
CURLOPT_POSTFIELDSPOST 數據(陣列自動編碼為 multipart/form-data)陣列或字符串
CURLOPT_HTTPHEADER自定義請求頭數組['Authorization: Bearer xxx']
CURLOPT_COOKIEJAR保存響應 Cookie 到文件/tmp/cookies.txt
CURLOPT_COOKIEFILE發送請求時攜帶的 Cookie 文件/tmp/cookies.txt

進階:POST 提交 JSON 數據

<?php
$ch = curl_init('https://api.example.com/users');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Accept: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => '張三',
        'email' => 'zhangsan@example.com',
    ]),
    CURLOPT_TIMEOUT => 10,
]);
$resp = curl_exec($ch);
if ($resp === false) {
    echo "錯誤:" . curl_error($ch);
} else {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "HTTP $httpCode\n$resp";
}
curl_close($ch);
?>

錯誤處理最佳實踐

<?php
function curlSafeExec($ch) {
    $resp = curl_exec($ch);
    if ($resp === false) {
        $errno = curl_errno($ch);
        $error = curl_error($ch);
        error_log("cURL[$errno] $error");
        return null;
    }
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($httpCode < 200 || $httpCode >= 300) {
        error_log("HTTP $httpCode: $resp");
    }
    return $resp;
}
?>

常見問題 FAQ

Q: 為什麼 curl_exec 返回 bool(false) 且無輸出?
A: 檢查 curl_error($ch),常見原因:DNS 解析失敗、連接超時、SSL 證書驗證失敗、目標服務器拒絕連接。
Q: 如何抓取 HTTPS 頁面而不報 SSL 錯誤?
A: 開發環境可暫時設置 CURLOPT_SSL_VERIFYPEER => false;生產環境務必配置 CA 證書路徑 CURLOPT_CAINFO => '/etc/ssl/certs/ca-certificates.crt'。
Q: 如何獲取響應頭?
A: 設置 CURLOPT_HEADER => true,則 curl_exec 返回「頭部\r\n\r\n體」,需自行分割;或使用 curl_setopt($ch, CURLOPT_HEADERFUNCTION, $callback) 回調逐行處理。
Q: 並發請求如何實現?
A: 使用 curl_multi_init() 多執行緒並發,或改用 Swoole / ReactPHP / Guzzle 異步客戶端。

總結

cURL 的核心流程只有四步:init → setopt(_array) → exec → close。掌握常用選項組合,即可應對 95% 的 HTTP 交互場景。建議將常用配置封裝為工具類或使用成熟庫(Guzzle、Symfony HttpClient),提升代碼可維護性與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved