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

PHP cURL 實戰範例精選:網頁抓取、POST 提交、檔案上傳與模擬登入

     編輯:PHP 相關知識

核心概念回顧

cURL 的關鍵在於 CURLOPT_RETURNTRANSFER 選項:

  • true — curl_exec() 回傳內容字串(方便後續處理)
  • false (預設) — 直接輸出到瀏覽器

範例一:基本 GET 抓取並取得內容

<?php
$url = "https://www.baidu.com";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$content = curl_exec($ch);

if (curl_errno($ch)) {
    die("cURL 錯誤: " . curl_error($ch));
}

echo "HTTP 狀態碼: " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "\n";
echo "內容長度: " . strlen($content) . " 字元\n";
// 這裡可進行 DOM 解析、正則擷取等後續處理

curl_close($ch);
?>

範例二:POST 表單提交(模擬搜尋/登入)

<?php
$url = "https://httpbin.org/post"; // 測試用端點
$postData = [
    'username' => 'testuser',
    'password' => 'secret123',
    'action'   => 'login'
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query($postData), // application/x-www-form-urlencoded
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT        => 15,
    CURLOPT_HTTPHEADER     => [
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Referer: https://example.com/login'
    ]
]);

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

echo "狀態碼: $httpCode\n";
echo "回應: $response\n";
?>

範例三:檔案上傳 (multipart/form-data)

<?php
$url = "https://api.example.com/upload";
$filePath = "/path/to/local/image.jpg";

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => [
        'file' => new CURLFile($filePath, 'image/jpeg', 'upload.jpg'),
        'folder' => 'images'
    ],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT        => 30
]);

$response = curl_exec($ch);
curl_close($ch);
var_dump(json_decode($response, true));
?>
注意: PHP 5.5+ 必須使用 CURLFile 類別,舊版 @/path/to/file 語法已棄用且不安全。

範例四:模擬登入並維持 Session(Cookie 管理)

<?php
$cookieFile = sys_get_temp_dir() . '/curl_cookie_' . md5('example.com') . '.txt';

// --- 步驟 1:登入取得 Cookie ---
$loginUrl = "https://example.com/login";
$loginData = ['user' => 'demo', 'pass' => 'demo123'];

$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => http_build_query($loginData),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEJAR      => $cookieFile, // 儲存 Cookie
    CURLOPT_COOKIEFILE     => $cookieFile, // 讀取 Cookie
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT        => 15
]);
curl_exec($ch);
curl_close($ch);

// --- 步驟 2:攜帶 Cookie 訪問受保護頁面 ---
$protectedUrl = "https://example.com/dashboard";
$ch = curl_init($protectedUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEFILE     => $cookieFile, // 只需讀取
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT        => 10
]);
$dashboard = curl_exec($ch);
curl_close($ch);

echo "儀表板內容長度: " . strlen($dashboard);
?>

範例五:JSON API 請求(含 Authorization Header)

<?php
$apiUrl = "https://api.example.com/v1/users";
$payload = json_encode(['name' => 'John', 'email' => 'john@example.com']);
$token = "Bearer YOUR_ACCESS_TOKEN";

$ch = curl_init($apiUrl);
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST  => "POST", // 或 PUT/PATCH/DELETE
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'Content-Length: ' . strlen($payload),
        'Authorization: ' . $token
    ],
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_TIMEOUT        => 10
]);

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

if ($httpCode >= 200 && $httpCode < 300) {
    $data = json_decode($response, true);
    print_r($data);
} else {
    echo "API 錯誤 ($httpCode): $response";
}
?>

除錯小技巧

  • 開啟 CURLOPT_VERBOSE => true 並設定 CURLOPT_STDERR => fopen('curl_debug.log', 'w') 記錄完整溝通細節
  • 使用 curl_getinfo($ch) 取得連線時間、DNS 解析時間、下載速度等效能指標
  • 遇到「SSL certificate problem」請下載 cacert.pem 並設定 CURLOPT_CAINFO
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved