# 如何使用PHP cURL函數
## 目錄
1. [cURL簡介](#curl簡介)
2. [安裝與配置](#安裝與配置)
3. [基本使用流程](#基本使用流程)
4. [常用cURL函數詳解](#常用curl函數詳解)
5. [GET請求示例](#get請求示例)
6. [POST請求示例](#post請求示例)
7. [文件上傳](#文件上傳)
8. [HTTP認證](#http認證)
9. [處理HTTPS請求](#處理https請求)
10. [設置請求頭](#設置請求頭)
11. [處理Cookie](#處理cookie)
12. [并發請求](#并發請求)
13. [錯誤處理](#錯誤處理)
14. [性能優化](#性能優化)
15. [實際應用場景](#實際應用場景)
16. [安全注意事項](#安全注意事項)
17. [常見問題解答](#常見問題解答)
<a id="curl簡介"></a>
## 1. cURL簡介
cURL(Client URL Library)是一個強大的開源庫,支持多種協議(HTTP、HTTPS、FTP等),允許你通過URL傳輸數據。PHP中的cURL擴展提供了與libcurl庫的接口,使PHP能夠與其他服務器進行通信。
主要特點:
- 支持多種協議(HTTP/HTTPS/FTP/FTPS等)
- 支持SSL證書
- HTTP POST/PUT/DELETE等方法
- 表單提交
- 文件上傳/下載
- Cookie支持
- 代理支持
<a id="安裝與配置"></a>
## 2. 安裝與配置
### 檢查是否已安裝
```php
<?php
if (!function_exists('curl_init')) {
die('cURL擴展未安裝');
}
?>
Linux系統:
sudo apt-get install php-curl # Debian/Ubuntu
sudo yum install php-curl # CentOS/RHEL
Windows系統:
extension=curl<?php
phpinfo();
// 搜索"cURL support"確認是否啟用
?>
標準cURL請求流程:
1. 初始化cURL會話:curl_init()
2. 設置cURL選項:curl_setopt()
3. 執行請求:curl_exec()
4. 獲取錯誤信息(可選):curl_error()
5. 獲取請求信息(可選):curl_getinfo()
6. 關閉cURL會話:curl_close()
基本示例:
<?php
// 1. 初始化
$ch = curl_init();
// 2. 設置選項
curl_setopt($ch, CURLOPT_URL, "http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 3. 執行并獲取結果
$output = curl_exec($ch);
// 4. 檢查錯誤
if ($output === false) {
echo "cURL Error: " . curl_error($ch);
}
// 5. 關閉會話
curl_close($ch);
// 處理結果
echo $output;
?>
初始化一個新的cURL會話。
$ch = curl_init([string $url = null]);
設置cURL選項。
bool curl_setopt(resource $ch, int $option, mixed $value);
常用選項:
- CURLOPT_URL: 請求的URL
- CURLOPT_RETURNTRANSFER: 返回結果而不直接輸出
- CURLOPT_POST: 啟用POST請求
- CURLOPT_POSTFIELDS: POST數據
- CURLOPT_HEADER: 包含響應頭
- CURLOPT_HTTPHEADER: 設置請求頭
- CURLOPT_FOLLOWLOCATION: 跟隨重定向
- CURLOPT_SSL_VERIFYPEER: 驗證SSL證書
- CURLOPT_TIMEOUT: 超時時間(秒)
執行cURL會話。
mixed curl_exec(resource $ch);
關閉cURL會話。
void curl_close(resource $ch);
返回最后一次錯誤的字符串。
string curl_error(resource $ch);
獲取最后一次傳輸的信息。
mixed curl_getinfo(resource $ch [, int $opt = 0]);
常用信息:
- CURLINFO_HTTP_CODE: 最后收到的HTTP代碼
- CURLINFO_TOTAL_TIME: 總傳輸時間
- CURLINFO_SIZE_DOWNLOAD: 下載字節數
基本GET請求:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/api?param1=value1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
帶參數的GET請求:
<?php
$params = [
'key1' => 'value1',
'key2' => 'value2'
];
$url = 'http://example.com/api?' . http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
基本POST請求:
<?php
$postData = [
'username' => 'admin',
'password' => 'secret'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/login");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
發送JSON數據:
<?php
$data = [
'name' => 'John Doe',
'email' => 'john@example.com'
];
$json = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/api/users");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($json)
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
上傳單個文件:
<?php
$file = new CURLFile('path/to/file.jpg', 'image/jpeg', 'file.jpg');
$postData = [
'userfile' => $file,
'other_field' => 'value'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/upload");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
上傳多個文件:
<?php
$files = [
'file1' => new CURLFile('path/to/file1.jpg'),
'file2' => new CURLFile('path/to/file2.jpg')
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/multi-upload");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
基本認證:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/protected");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
摘要認證:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/protected");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
禁用SSL驗證(不推薦生產環境使用):
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
使用CA證書驗證:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CNFO, "/path/to/cacert.pem");
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
自定義請求頭:
<?php
$headers = [
'Authorization: Bearer token123',
'Content-Type: application/json',
'X-Custom-Header: value'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/api");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
獲取響應頭:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $header_size);
$body = substr($response, $header_size);
curl_close($ch);
echo "Headers:\n$headers\n\nBody:\n$body";
?>
發送Cookie:
<?php
$cookie = "name=value; name2=value2";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
保存Cookie到文件:
<?php
$cookie_file = tempnam(sys_get_temp_dir(), "cookie");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/login");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=secret");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
$response = curl_exec($ch);
curl_close($ch);
// 后續請求使用保存的cookie
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/profile");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
使用curlmulti*函數實現并發請求:
<?php
$urls = [
'http://example.com/api/1',
'http://example.com/api/2',
'http://example.com/api/3'
];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$handles[$i] = curl_init();
curl_setopt($handles[$i], CURLOPT_URL, $url);
curl_setopt($handles[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $handles[$i]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
$results = [];
foreach ($handles as $i => $handle) {
$results[$i] = curl_multi_getcontent($handle);
curl_multi_remove_handle($mh, $handle);
curl_close($handle);
}
curl_multi_close($mh);
print_r($results);
?>
基本錯誤處理:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://invalid.url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
$error = curl_error($ch);
$errno = curl_errno($ch);
echo "cURL Error ($errno): $error";
} else {
echo $response;
}
curl_close($ch);
?>
獲取HTTP狀態碼:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
echo "請求失敗,HTTP狀態碼:$httpCode";
} else {
echo $response;
}
curl_close($ch);
?>
// 第二次請求(復用同一個句柄) curl_setopt(\(ch, CURLOPT_URL, "http://example.com/api2"); \)response2 = curl_exec($ch);
curl_close($ch); ?>
2. **設置合理的超時時間**:
```php
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 總超時時間
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 連接超時時間
啟用Keep-Alive:
curl_setopt($ch, CURLOPT_TCP_KEEPALIVE, 1);
curl_setopt($ch, CURLOPT_TCP_KEEPIDLE, 120);
curl_setopt($ch, CURLOPT_TCP_KEEPINTVL, 60);
使用DNS緩存:
curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 86400); // 24小時
\(data = json_decode(\)response, true); ?> “`
// 使用DOM解析HTML \(dom = new DOMDocument(); @\)dom->load
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。