2024 PHP Conference Japan (日本 PHP 研討會)

curl_setopt_array

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

curl_setopt_array設定 cURL 傳輸的多個選項

說明

curl_setopt_array(CurlHandle $handle, array $options): bool

為 cURL 工作階段設定多個選項。這個函式在設定大量 cURL 選項時非常有用,可以避免重複呼叫 curl_setopt()

參數

handle

curl_init() 返回的 cURL 句柄。

options

一個 陣列,指定要設定的選項及其值。鍵值應該是有效的 curl_setopt() 常數或其整數等效值。

返回值

如果所有選項都設定成功,則返回 true。如果某個選項設定失敗,則立即返回 false,並忽略 options 陣列中的任何後續選項。

更新日誌

版本 說明
8.0.0 handle 現在需要一個 CurlHandle 實例;以前需要的是 資源

範例

範例 #1 初始化新的 cURL 工作階段並擷取網頁

<?php
// 建立新的 cURL 資源
$ch = curl_init();

// 設定網址和其他適當的選項
$options = array(CURLOPT_URL => 'http://www.example.com/',
CURLOPT_HEADER => false
);

curl_setopt_array($ch, $options);

// 抓取網址並傳遞給瀏覽器
curl_exec($ch);

// 關閉 cURL 資源,並釋放系統資源
curl_close($ch);
?>

注意事項

注意:

curl_setopt() 一樣,將陣列傳遞給 CURLOPT_POST 會將資料編碼為 multipart/form-data,而傳遞 URL 編碼的字串會將資料編碼為 application/x-www-form-urlencoded

參見

新增註釋

使用者貢獻的筆記 8 則筆記

Lionel
9 年前
如果您正在為您的函式庫撰寫小型 API,並且如果您正在合併選項,請記住使用聯集運算子 (+)!

因此像這樣的程式碼肯定會失敗。這是因為 array_merge 會有效地將陣列中的所有鍵重置為連續的數字。

<?php
function post($url, $options = array) {
$ch = curl_init();
curl_setopt_array($ch, array_merge(array(
CURLOPT_HEADER => 1,
CURLOPT_RETURNTRANSFER => 1,
.....
)));
?>

正確的做法應該是這樣

<?php
function post($url, $options = array) {
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_HEADER => 1,
CURLOPT_RETURNTRANSFER => 1,
.....
) + (array)
$options);
?>
maran dot emil at gmail dot com
15 年前
如果您需要使用 curl 讀取 https 的 SSL 頁面內容,這個函式可以幫助您。

<?php

function get_web_page( $url,$curl_data )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_POST => 1, // i am sending post data
CURLOPT_POSTFIELDS => $curl_data, // this are my post vars
CURLOPT_SSL_VERIFYHOST => 0, // don't verify ssl
CURLOPT_SSL_VERIFYPEER => false, //
CURLOPT_VERBOSE => 1 //
);

$ch = curl_init($url);
curl_setopt_array($ch,$options);
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch) ;
$header = curl_getinfo($ch);
curl_close($ch);

// $header['errno'] = $err;
// $header['errmsg'] = $errmsg;
// $header['content'] = $content;
return $header;
}

$curl_data = "var1=60&var2=test";
$url = "https://www.example.com";
$response = get_web_page($url,$curl_data);

print
'<pre>';
print_r($response);

?>
lawrence at dub3solutions dot com
5 年前
這個函式與 `curl_file_create` (`CURLFile` 物件) 和 `CURLOPT_POSTFIELDS` 並不相容。我花了很長時間才弄清楚,但基本上我收到一個「無效的檔案名稱」PHP 警告,而且檔案沒有被送出。我能夠像這樣修正這個問題:

curl_setopt_array($curl, $curlOpts);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);

我從 `$curlOpts` 中移除 `$postFields` 值,並使用 `curl_setopt` 單獨設定它。
bendavis78 at gmail dot com
18 年前
您可以將 CURLOPT_HEADERFUNCTION 與物件內的回呼函式一起使用。這可以輕鬆擷取標頭以供稍後使用。例如:

<?php
class Test
{
public
$headers;

//...

public function exec($opts)
{
$this->headers = array();
$opts[CURLOPT_HEADERFUNCTION] = array($this, '_setHeader');
$ch = curl_init();
curl_setopt_array($ch, $opts);
return
curl_exec($ch);
}

private function
_setHeader($ch, $header)
{
$this->headers[] = $header;
return
strlen($header);
}


}

$test = new Test();
$opts = array(
//... your curl opts here
);
$data = $test->exec($opts);
print_r($test->headers);
?>

... 類似這樣

(這個在 php 5.1.4 版本可以運作)
Al
7 年前
你可能會想用 `array_merge` 來合併以 `CURLOPT` 常數作為鍵值的陣列,但要小心。

<?php
array_merge
([], [CURLOPT_FOO => "foo"], [CURLOPT_BAR => "bar"]);
?>

因為這些常數是數值,`array_merge` 會很樂意地重新索引

<?php
[
mad_elf at maranelda dot org
2 年前
重要注意事項:`CURLINFO_HEADER_OUT` 選項會被 `curl_setopt_array()` *忽略*。你*必須*使用 `curl_setopt()` 來設定這個選項。

(至少在 PHP v7.3.27 中是如此)
Alexander
8 年前
曾幾何時,我遇到一個錯誤訊息:「SSL CA 憑證有問題(路徑?存取權限?)」。由於我正在做的事情幾乎是一項管理任務,沒有實際的安全問題,所以我決定停用憑證驗證,這就是最有趣的地方開始了。

首先我這樣做,而且它可以運作

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

接下來我想:「等等,我不想要寫死這些東西。讓我們用可配置的方式來使用它吧!」。所以我做了這樣的事:

// 在設定中
$CURL_OPTIONS = array(CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0);

...........

// 取代前面兩個直接呼叫的地方
curl_setopt_array($ch, $CURL_OPTIONS);

然後我很高興,沒有錯誤了... 你認為我會開心很久嗎?如果是這樣,那你就錯了。它停止顯示錯誤,但卻沒有開始運作!

我檢查了實際的資料,但它們都是正確的。然後我想:「這是 curl_setopt_array() 的問題嗎?讓我們把它變成一個迴圈。」實際上,就像這個說明中提到的那樣。

foreach ($CURL_OPTIONS as $name => $value)
{
curl_setopt($ch, $name, $value);
}

然後... 它和使用 curl_setopt_array() 呼叫的方式一樣無法運作。而且資料仍然是正確的...

所以,如果你碰巧無法使用 curl_setopt_array() 呼叫設定 CURL 選項,那麼現在你知道該怎麼做了,而且你知道絕對不是你的錯。

P.S.
順帶一提,使用的配置是
Linux i-ween.com 3.2.0-4-amd64 #1 SMP Debian 3.2.73-2+deb7u3 x86_64
PHP 版本 5.5.17
anthon at piwik dot org
14 年前
從 PHP 5.2.0 開始,當啟用了安全模式 (safe_mode) 或設定了 open_basedir 時,無法透過 curl_setopt_array()(或 curl_setopt())設定 CURLOPT_FOLLOWLOCATION。在這些情況下,陣列中 CURLOPT_* 設定的順序可能很重要。
To Top