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

一个 array,指定要设置的选项及其值。键应该是有效的 curl_setopt() 常量或它们的整数等效项。

返回值

如果所有选项都成功设置,则返回 true。如果无法成功设置某个选项,则立即返回 false,忽略 options 数组中任何后续选项。

变更日志

版本 说明
8.0.0 handle 现在期望一个 CurlHandle 实例;以前,期望的是一个 resource

范例

范例 #1 初始化新的 cURL 会话并获取网页

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

// 设置 URL 和其他适当的选项
$options = array(CURLOPT_URL => 'http://www.example.com/',
CURLOPT_HEADER => false
);

curl_setopt_array($ch, $options);

// 获取 URL 并传递给浏览器
curl_exec($ch);

// 关闭 cURL 资源,释放系统资源
curl_close($ch);
?>

注释

注意:

curl_setopt() 一样,将数组传递给 CURLOPT_POST 将对数据进行 multipart/form-data 编码,而传递 URL 编码字符串将对数据进行 application/x-www-form-urlencoded 编码。

参见

添加注释

用户贡献注释 10 个注释

Lionel
8 年前
如果您正在为您的库编写一个小型 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, // 返回网页
CURLOPT_HEADER => false, // 不返回头信息
CURLOPT_FOLLOWLOCATION => true, // 跟踪重定向
CURLOPT_ENCODING => "", // 处理所有编码
CURLOPT_USERAGENT => "spider", // 我是谁
CURLOPT_AUTOREFERER => true, // 在重定向时设置引用者
CURLOPT_CONNECTTIMEOUT => 120, // 连接超时
CURLOPT_TIMEOUT => 120, // 响应超时
CURLOPT_MAXREDIRS => 10, // 在 10 次重定向后停止
CURLOPT_POST => 1, // 我正在发送 POST 数据
CURLOPT_POSTFIELDS => $curl_data, // 这些是我的 POST 变量
CURLOPT_SSL_VERIFYHOST => 0, // 不要验证 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 v. 5.1.4 中有效)
Al
7 年前
您可能很想对 CURLOPT 常量作为键的数组使用 array_merge,但要小心。

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

由于这些常量是数字,array_merge 将很乐意重新索引

<?php
[0 => "foo", 1 => "bar"];
?>
mad_elf at maranelda dot org
2 年前
重要提示:选项 CURLINFO_HEADER_OUT 被 curl_setopt_array() *忽略*。您*必须*使用 curl_setopt() 来设置此选项。

(至少在 PHP v7.3.27 中为真)
Alexander
7 年前
曾经我遇到过一个错误,比如“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_* 设置的顺序可能很重要。
loop4u at gmail dot com
13 年前
需要注意的是,在循环中使用 CURLOPT_POSTFIELDS 时,CURLOPT_POSTFIELDS 会附加到字符串中。如果您不希望这种行为,可以使用 unset()。

<?php
// 这将附加 postfields

while(true) {
$options = array(CURLOPT_POSTFIELDS => 'foo=bar&foo2=bar');
$ch = curl_init("http://www.example.com");
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
}

// 这将不会附加 postfields
while(true) {
$options = array(CURLOPT_POSTFIELDS => 'foo=bar&foo2=bar');
$ch = curl_init("http://www.example.com");
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
unset(
$options[CURLOPT_POSTFIELDS]);
}
?>
fnjordy at gmail dot com
15 年前
PHP 模块中没有 CURLOPT_MAXFILESIZE,但它的功能仅适用于 Content-Length 标头。有两种方法可以检查下载大小,一种是在下载完成后使用 filesize(),另一种是在下载运行时,允许您在浪费时间和磁盘空间之前终止。

<?php
$GLOBALS
['file_size'] = 0;
$GLOBALS['max_file_size'] = 1024 * 1024;
function
on_curl_header($ch, $header)
{
$trimmed = rtrim($header);
if (
preg_match('/^Content-Length: (\d+)$/', $trimmed, $matches))
{
$file_size = $matches[1];
if (
$file_size > $GLOBALS['max_file_size']) {
// 处理错误。
}
}
return
strlen($header);
}

function
on_curl_write($ch, $data)
{
$bytes = strlen($data);
$GLOBALS['file_size'] += $bytes;
if (
$GLOBALS['file_size'] > $GLOBALS['max_file_size']) {
// 处理错误。
}
return
$bytes;
}

$ch = curl_init();
$options = array(CURLOPT_URL => 'https://php.net/',
CURLOPT_HEADER => false,
CURLOPT_HEADERFUNCTION => 'on_curl_header',
CURLOPT_WRITEFUNCTION => 'on_curl_write');
curl_setopt_array($ch, $options);
curl_exec($ch);
// ...
?>
To Top