PHP Conference Japan 2024

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

参见

添加注释

用户贡献的注释 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, // 返回网页内容
CURLOPT_HEADER => false, // 不返回头部信息
CURLOPT_FOLLOWLOCATION => true, // 跟踪重定向
CURLOPT_ENCODING => "", // 处理所有编码
CURLOPT_USERAGENT => "spider", // 我是谁
CURLOPT_AUTOREFERER => true, // 在重定向时设置referer
CURLOPT_CONNECTTIMEOUT => 120, // 连接超时时间
CURLOPT_TIMEOUT => 120, // 响应超时时间
CURLOPT_MAXREDIRS => 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(
//... 你的curl选项
);
$data = $test->exec($opts);
print_r($test->headers);
?>

……类似这样

(这在php v. 5.1.4中有效)
Al
7年前
您可能会倾向于使用array_merge与CURLOPT常量为键的数组,但请注意。

<?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
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选项,那么现在您知道该怎么做,并且您知道绝对不是您的错。

附注:
顺便说一句,使用的配置是
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