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

PHP cURL 類完整實現:GET、POST 請求與檔案下載功能詳解

     編輯:PHP 綜合知識

前言

在 PHP 開發中,cURL 是處理 HTTP 請求最強大且靈活的工具之一。本文提供一個封裝良好的 Curl 類,支援 GET 請求、POST 表單提交以及遠端檔案下載三大核心功能,並內建 Cookie 管理與 SSL 憑證處理,可直接應用於爬蟲、API 串接、自動化測試等場景。

類架構設計

該類採用單一職責原則,將三種操作封裝為獨立方法:

  • get():執行 HTTP GET 請求,支援自動重導向、Cookie 讀取與 Referer 自動設定
  • post():模擬瀏覽器表單提交,支援 SSL 驗證跳過、User-Agent 偽裝、Cookie 寫入與多欄位資料編碼
  • reutersload():以串流方式下載遠端檔案至本地,支援帶 Cookie 下載受保護資源

核心程式碼實現

<?php
class Curl {
    /**
     * GET 方式請求指定 URL
     * @param string $url 目標網址
     * @param string $cookie Cookie 檔案路徑(可選)
     * @return string 回應內容
     */
    public function get($url, $cookie = '') {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        if (!empty($cookie)) {
            curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
        }
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        $tmp = curl_exec($curl);
        curl_close($curl);
        return $tmp;
    }

    /**
     * POST 方式模擬表單提交
     * @param string $url 目標網址
     * @param array $params 表單欄位陣列
     * @param string $cookie Cookie 儲存路徑
     * @return string 回應內容
     */
    public function post($url, $params, $cookie) {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] ?? 'PHP cURL');
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
        $result = curl_exec($curl);
        curl_close($curl);
        return $result;
    }

    /**
     * 遠端檔案下載至本地
     * @param string $remote 遠端檔案 URL
     * @param string $local 本地儲存路徑
     * @param string $cookie Cookie 檔案路徑(可選)
     * @return void
     */
    public function reutersload($remote, $local, $cookie = '') {
        $cp = curl_init($remote);
        $fp = fopen($local, "w");
        curl_setopt($cp, CURLOPT_FILE, $fp);
        curl_setopt($cp, CURLOPT_HEADER, 0);
        if ($cookie != '') {
            curl_setopt($cp, CURLOPT_COOKIEFILE, $cookie);
        }
        curl_exec($cp);
        curl_close($cp);
        fclose($fp);
    }
}

關鍵參數解析

SSL 相關設定

  • CURLOPT_SSL_VERIFYPEER = false:跳過對等憑證驗證,適用於自簽憑證或測試環境
  • CURLOPT_SSL_VERIFYHOST = 1:僅檢查憑證中是否存在 Common Name,不驗證其有效性

Cookie 管理機制

GET 使用 CURLOPT_COOKIEFILE 讀取現有 Cookie;POST 使用 CURLOPT_COOKIEJAR 寫入/更新 Cookie,實現會話保持。

資料編碼處理

http_build_query() 將關聯陣列轉為 application/x-www-form-urlencoded 格式;若欄位值為陣列,自動切換為 multipart/form-data 支援檔案上傳(檔案名前加 @ 前綴)。

使用範例

<?php
$curl = new Curl();

// GET 請求範例
$html = $curl->get('https://api.example.com/users', 'cookies.txt');

// POST 登入範例
$loginData = ['username' => 'admin', 'password' => 'secret'];
$response = $curl->post('https://example.com/login', $loginData, 'cookies.txt');

// 下載受保護圖片
$curl->reutersload('https://example.com/protected/image.png', './downloads/image.png', 'cookies.txt');

進階應用建議

  • 生產環境建議啟用 CURLOPT_SSL_VERIFYPEER 並配合 CURLOPT_CAINFO 指定 CA 憑證束
  • 長時間運行的爬蟲應加入 CURLOPT_TIMEOUT 與 CURLOPT_CONNECTTIMEOUT 防止阻塞
  • 大檔案下載可搭配 CURLOPT_PROGRESSFUNCTION 實現進度條顯示

總結

這個 Curl 類以簡潔的介面封裝了最常用的 HTTP 操作,程式碼結構清晰、註釋完整,適合作為專案基礎元件或學習參考。實際部署時請根據安全需求調整 SSL 驗證策略,並妥善管理 Cookie 檔案權限。

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