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

PHP cURL 庫實戰應用大全:GET/POST/代理/模擬登入

     編輯:PHP 相關知識

核心函數速查表

函數用途
curl_init()初始化 cURL 會話,返回句柄
curl_setopt()設定單一選項
curl_setopt_array()批次設定選項 (陣列)
curl_exec()執行會話
curl_getinfo()取得傳輸資訊 (HTTP 碼、耗時等)
curl_error()/curl_errno()取得錯誤訊息/代碼
curl_close()關閉會話釋放資源

基礎 GET 請求範例

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/data');
curl_setopt($ch, CURLOPT_HEADER, 0);        // 不包含回應標頭
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回字串而非直接輸出
curl_setopt($ch, CURLOPT_TIMEOUT, 10);      // 超時 10 秒
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 開發環境跳過 SSL 驗證

$response = curl_exec($ch);

if (curl_errno($ch)) {
    error_log('cURL 錯誤: ' . curl_error($ch));
}

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

var_dump($response);
?>

POST 資料提交

<?php
$postData = [
    'phone' => '13800138000',
    'message' => '測試訊息',
    'action' => 'send'
];

$ch = curl_init('https://api.example.com/sms/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); // 自動編碼
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/x-www-form-urlencoded',
    'User-Agent: MyApp/1.0'
]);

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

使用 Proxy 代理

<?php
$ch = curl_init('https://httpbin.org/ip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com:1080');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'username:password'); // 若需認證
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); // 或 SOCKS5

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

模擬登入 Discuz (含 Cookie 管理)

<?php
$discuzUrl = 'https://bbs.example.com';
$loginUrl = $discuzUrl . '/member.php?mod=logging&action=login&loginsubmit=yes';
$targetUrl = $discuzUrl . '/home.php?mod=spacecp&ac=profile';
$cookieFile = __DIR__ . '/cookie.txt';

// 1. 取得 formhash
$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_SSL_VERIFYPEER => false,
]);
$html = curl_exec($ch);
curl_close($ch);

preg_match('/name="formhash" value="([^"]+)"/', $html, $matches);
$formhash = $matches[1] ?? '';

// 2. 提交登入
$postData = [
    'formhash' => $formhash,
    'username' => 'your_username',
    'password' => 'your_password',
    'questionid' => 0,
    'answer' => '',
    'loginsubmit' => 'true'
];

$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query($postData),
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_SSL_VERIFYPEER => false,
]);
curl_exec($ch);
curl_close($ch);

// 3. 攜帶 Cookie 訪問需登入頁面
$ch = curl_init($targetUrl);
curl_setopt_array($ch, [
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
]);
$content = curl_exec($ch);
curl_close($ch);

echo $content;
?>

多執行緒並發請求 (curl_multi)

<?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_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_multi_add_handle($mh, $ch);
    $handles[$url] = $ch;
}

$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

$results = [];
foreach ($handles as $url => $ch) {
    $results[$url] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);

print_r($results);
?>

重要選項速查

選項說明
CURLOPT_TIMEOUT最大執行秒數
CURLOPT_CONNECTTIMEOUT連線等待秒數
CURLOPT_FOLLOWLOCATION自動跟隨重導向
CURLOPT_MAXREDIRS最大重導向次數
CURLOPT_USERAGENT設定 User-Agent
CURLOPT_HTTPHEADER自訂請求標頭陣列
CURLOPT_SSL_VERIFYPEER驗證 SSL 憑證 (生產環境必須 true)
CURLOPT_CAINFO指定 CA 憑證路徑

最佳實踐總結

  • 永遠設定 CURLOPT_TIMEOUT 防止阻塞
  • 生產環境必須驗證 SSL 憑證
  • 善用 curl_getinfo() 監控效能指標
  • 重複請求重複使用句柄 (curl_reset()) 提升效能
  • 錯誤處理需區分網路錯誤、HTTP 錯誤、業務邏輯錯誤
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved