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

PHP cURL 核心函數詳解:curl_init()、curl_setopt() 實戰指南

     編輯:PHP 相關知識

cURL 簡介

cURL (Client URL Library) 是 PHP 最強大的 HTTP 客端庫,支援 HTTP/HTTPS、FTP、FTPS、SFTP、LDAP、MQTT 等協議,提供精細的請求控制(Header、Cookie、代理、SSL、超時、斷點續傳、多線程並發),是 API 對接、爬蟲、微服務通信的標準選擇。

核心流程

  1. curl_init() 初始化會話,返回句柄 $ch
  2. curl_setopt() / curl_setopt_array() 設置選項
  3. curl_exec() 執行請求
  4. curl_close() 釋放資源

關鍵函數語法

resource curl_init ( [ string $url = null ] )
bool curl_setopt ( resource $ch, int $option, mixed $value )
bool curl_setopt_array ( resource $ch, array $options )
mixed curl_exec ( resource $ch )
void curl_close ( resource $ch )

常用選項分類速查

類別選項常量說明
URL/請求CURLOPT_URL目標 URL
CURLOPT_CUSTOMREQUEST自定義方法(GET/POST/PUT/DELETE/PATCH)
CURLOPT_POSTtrue=POST 請求
CURLOPT_POSTFIELDSPOST 數據(陣列=multipart/form-data,字符串=application/x-www-form-urlencoded)
Header/CookieCURLOPT_HTTPHEADER自定義 Header 陣列
CURLOPT_COOKIE發送 Cookie 字符串
CURLOPT_COOKIEJAR保存響應 Cookie 到文件
CURLOPT_COOKIEFILE從文件讀取 Cookie 發送
SSL/安全CURLOPT_SSL_VERIFYPEER驗證服務器證書(生產必須 true)
CURLOPT_SSL_VERIFYHOST驗證宿主名(2=嚴格)
CURLOPT_CAINFOCA 證書文件路徑
CURLOPT_SSLCERT/SSLKEY客戶端證書/私鑰(雙向 TLS)
超時/限制CURLOPT_TIMEOUT總超時秒數
CURLOPT_CONNECTTIMEOUT連接超時秒數
CURLOPT_MAXREDIRS最大重定向次數
CURLOPT_BUFFERSIZE讀寫緩衝區大小
輸出控制CURLOPT_RETURNTRANSFERtrue=返回字符串,false=直接輸出
CURLOPT_HEADERtrue=包含響應 Header
CURLOPT_WRITEFUNCTION自定義寫入回調(流式處理)

實戰範例集

範例 1:基礎 GET 請求

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/users');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
if ($response === false) {
    echo "錯誤: " . curl_error($ch);
} else {
    $data = json_decode($response, true);
    print_r($data);
}
curl_close($ch);
?>

範例 2:POST JSON 數據(API 典型調用)

<?php
$ch = curl_init('https://api.example.com/orders');
$payload = json_encode(['user_id' => 123, 'items' => [['sku' => 'A001', 'qty' => 2]]]);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $payload,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $access_token,
        'Accept: application/json'
    ],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 15,
    CURLOPT_SSL_VERIFYPEER => true, // 生產環境必須開啟
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
?>

範例 3:文件上傳

<?php
$ch = curl_init('https://api.example.com/upload');
$cfile = new CURLFile('/path/to/image.jpg', 'image/jpeg', 'photo.jpg'); // PHP 5.5+
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => ['file' => $cfile, 'user_id' => 123],
    CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
?>

範例 4:流式下載大文件(不佔用記憶體)

<?php
$ch = curl_init('https://cdn.example.com/large.iso');
$fp = fopen('/tmp/large.iso', 'wb');
curl_setopt_array($ch, [
    CURLOPT_FILE => $fp, // 直接寫入文件句柄
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_TIMEOUT => 0, // 無總超時
    CURLOPT_CONNECTTIMEOUT => 30,
    CURLOPT_NOPROGRESS => false,
    CURLOPT_PROGRESSFUNCTION => function($ch, $dltotal, $dlnow, $ultotal, $ulnow) {
        if ($dltotal > 0) printf("\r下載進度: %.2f%%", $dlnow/$dltotal*100);
    }
]);
curl_exec($ch);
fclose($fp);
curl_close($ch);
?>

範例 5:並發多請求

<?php
$urls = ['https://api1.example.com', 'https://api2.example.com', 'https://api3.example.com'];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[$url] = $ch;
}

$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh, 0.1); // 等待活動
} while ($running > 0);

foreach ($handles as $url => $ch) {
    $response = curl_multi_getcontent($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "$url: HTTP $http_code\n";
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);
?>

進階技巧與避坑

  • 復用句柄:同域名多請求復用 $ch,保持 Keep-Alive 連接,減少握手開銷。
  • DNS 緩存:CURLOPT_DNS_CACHE_TIMEOUT(默認 120s)避免頻繁解析。
  • 憑證綁定:CURLOPT_PINNEDPUBLICKEY 防中間人攻擊。
  • 錯誤處理:curl_errno()、curl_error()、curl_getinfo($ch, CURLINFO_HTTP_CODE) 三重檢查。
  • 內存洩漏:長運行腳本定期 curl_close() 重建句柄,釋放 libcurl 內部緩存。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved