简介
PHP
支持 Daniel Stenberg
创建的 libcurl
库,能够连接通讯各种服务器、使用各种协议。
libcurl
目前支持的协议有 http
、https
、ftp
、gopher
、telnet
、dict
、file
、ldap
。
libcurl
同时支持 HTTPS
证书、HTTP POST
、HTTP PUT
、 FTP
上传(也能通过 PHP
的 FTP
扩展完成)、HTTP
基于表单的上传、代理、cookies
、用户名+密码的认证。
一个最简样例
// 初始化新的 cURL 会话
$ch = curl_init('http://www.baidu.com/');
// 执行 cURL 会话
curl_exec($ch);
// 关闭 cURL 会话
curl_close($ch);
curl_init
初始化新的会话
curl_init ([ string $url = NULL ] ) : resource
url
如果提供了该参数,
CURLOPT_URL
选项将会被设置成这个值。你也可以使用curl_setopt()
函数手动地设置这个值。
初始化新的会话,成功则返回 cURL
句柄,出错则返回 FALSE
。
curl_exec
执行会话
curl_exec ( resource $ch ) : mixed
ch
由
curl_init()
返回的cURL
句柄。
执行给定的 cURL
会话。成功时返回 TRUE
, 或者在失败时返回 FALSE
。 然而,如果 设置了 CURLOPT_RETURNTRANSFER
选项,函数执行成功时会返回执行的结果,失败时返回 FALSE
。
这个函数应该在初始化一个 cURL
会话并且全部的选项都被设置后被调用。
curl_close
结束会话
curl_close ( resource $ch ) : void
ch
由
curl_init()
返回的cURL
句柄。
关闭 cURL
会话并且释放所有资源。cURL
句柄 ch
也会被删除。
没有返回值。
curl_reset
重置会话
curl_reset ( resource $ch ) : void
ch
由
curl_init()
返回的cURL
句柄。
该函数将给定的 cURL
句柄所有选项重新设置为默认值,跟使用 curl_init()
创建的一样。在一次请求中需要发起多次 cURL
会话时可以用此函数重置会话,以减少会话创建的次数。
没有返回值。
curl_errno
返回最后一次的错误号
curl_errno ( resource $ch ) : int
ch
由
curl_init()
返回的cURL
句柄。
返回最近一次 cURL
操作的错误号;或在没有错误发生时返回 0 (零)。
curl_error
返回最后一次的错误描述
curl_error ( resource $ch ) : string
ch
由
curl_init()
返回的cURL
句柄。
返回最近一次 cURL
操作的文本错误详情;或者如果没有任何错误发生就返回 ‘’ (空字符串)
curl_copy_handle
复制一个cURL句柄和它的所有选项
curl_copy_handle ( resource $ch ) : resource
ch
由curl_init()
返回的cURL
句柄。
复制一个cURL句柄并保持相同的选项。
返回一个新的 cURL
句柄。
curl_setopt
设置一个cURL传输选项
curl_setopt ( resource $ch , int $option , mixed $value ) : bool
ch
由
curl_init()
返回的cURL
句柄。option
需要设置的
CURLOPT_XXX
选项。value
将设置在
option
选项上的值。
为 cURL 会话句柄设置选项。成功时返回 TRUE, 或者在失败时返回 FALSE。
以下为常用的一些选项(更多选项参见官网)
请求相关的选项
选项 | 值类型 | 默认 | 备注 |
---|---|---|---|
CURLOPT_URL | 字符串 | 需要获取的 URL 地址,也可以在 curl_init() 初始化会话的时候。 |
|
CURLOPT_POST | 布尔 | false | true 时会发送 POST 请求,类型为:application/x-www-form-urlencoded |
CURLOPT_CUSTOMREQUEST | 字符串 | 无 | HTTP 请求时,使用自定义的 Method 来代替 GET 或 HEAD 。对 DELETE 或者其他更隐蔽的 HTTP 请求有用。 有效值如 GET ,POST ,CONNECT 等 |
CURLOPT_POSTFIELDS | 字符串 | 无 | 全部数据使用 HTTP 协议中的 POST 操作来发送。 这个参数可以是 urlencoded 后的字符串,类似 para1=val1¶2=val2&... ,也可以使用一个以字段名为键值,字段数据为值的数组。 如果 value 是一个数组,Content-Type 头将会被设置成 multipart/form-data 。 |
CURLOPT_COOKIE | 字符串 | 无 | 设定 HTTP 请求中 Cookie: 部分的内容。多个 cookie 用分号分隔,分号后带一个空格(例如, fruit=apple; colour=red )。 |
CURLOPT_ENCODING | 字符串 | 无 | HTTP 请求头中 Accept-Encoding: 的值。 这使得能够解码响应的内容。 支持的编码有 identity ,deflate 和 gzip 。如果为空字符串””,会发送所有支持的编码类型。 |
CURLOPT_REFERER | 字符串 | 无 | 在 HTTP 请求头中 Referer: 的内容。 |
CURLOPT_USERAGENT | 字符串 | 无 | 在 HTTP 请求中包含一个 User-Agent: 头的字符串。 |
CURLOPT_HTTPHEADER | 数组 | 无 | 设置 HTTP 头字段的数组。格式: array('Content-type: text/plain', 'Content-length: 100') |
响应相关的选项
选项 | 值类型 | 默认 | 备注 |
---|---|---|---|
CURLOPT_HEADER | 布尔 | false | 启用时会将头文件的信息作为数据流输出 |
CURLOPT_RETURNTRANSFER | 布尔 | false | true 将 curl_exec() 获取的信息以字符串返回,而不是直接输出。 |
CURLOPT_NOBODY | 布尔 | false | ture 时将不输出 BODY 部分。同时 Mehtod 变成了 HEAD 。修改为 FALSE 时不会变成 GET |
CURLOPT_NOPROGRESS | 布尔 | true | true 时关闭 cURL 的传输进度。只有为了调试才需要设为 false 查看进度 |
CURLOPT_VERBOSE | 布尔 | false | true 会输出所有的信息,写入到 STDERR ,或在 CURLOPT_STDERR 中指定的文件。 |
CURLOPT_STDERR | 流资源 | 无 | 错误输出的地址,取代默认的 STDERR 。 |
超时时间相关的选项
选项 | 值类型 | 默认 | 备注 |
---|---|---|---|
CURLOPT_CONNECTTIMEOUT | 整数 | 在尝试连接时等待的秒数。设置为0,则无限等待。 | |
CURLOPT_CONNECTTIMEOUT_MS | 整数 | 尝试连接等待的时间,以毫秒为单位。设置为0,则无限等待。 如果 libcurl 编译时使用系统标准的名称解析器( standard system name resolver ),那部分的连接仍旧使用以秒计的超时解决方案,最小超时时间还是一秒钟。 |
|
CURLOPT_TIMEOUT | 整数 | 允许 cURL 函数执行的最长秒数。包括尝试连接和连接后接收数据的时间 |
|
CURLOPT_TIMEOUT_MS | 整数 | 设置 cURL 允许执行的最长毫秒数。 如果 libcurl 编译时使用系统标准的名称解析器( standard system name resolver ),那部分的连接仍旧使用以秒计的超时方案,最小超时时间还是一秒钟。 |
|
CURLOPT_NOSIGNAL | 布尔 | false, 在 SAPI 多线程传输时此项被默认启用 |
true 时忽略所有的 cURL 传递给 PHP 进行的信号。 网上据说设置的超时时间小于1000ms时此选项需要设置为 true ,个人实验的结果是不管设为true还是false,还是不设置,均不影响毫秒级超时时间的生效 |
SSL认证服务端相关的选项
选项 | 值类型 | 默认 | 备注 |
---|---|---|---|
CURLOPT_SSL_VERIFYPEER | 布尔 | 自cURL 7.10开始默认为 true | false 禁止 cURL 验证服务端证书(peer’s certificate)。 |
CURLOPT_SSL_VERIFYHOST | 整数 | 2 | 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 0 为不检查名称。 在生产环境中,这个值应该是 2(默认值)。 |
CURLOPT_CAINFO | 字符串 | 无 | 一个保存着1个或多个认证机构公钥的文件名。这个选项是和 CURLOPT_SSL_VERIFYPEER 一起使用的。可能需要绝对路径。 |
CURLOPT_CAPATH | 字符串 | 无 | 一个保存着多个 CA 证书的目录。这个选项是和 CURLOPT_SSL_VERIFYPEER 一起使用的。 |
linux
上 openssl
库的默认证书文件 default_cert_file
和默认证书目录 default_cert_dir
下的证书,可以验证常用的服务器证书。
在 windows
上没有通用 CA
包,或者在 linux
上需要验证其他特殊证书时,通过除了可以通过 CURLOPT_CAINFO
和 CURLOPT_CAPATH
进行指定,还可以通过修改 php.ini
来设置
openssl.cafile
openssl.capath
curl.cainfo
如果你不需要特殊的证书包,可以使用Mozilla提供的通用CA包,你可以在 这里 下载(由cURL的维护者提供)。
如果要使用 CURLOPT_CAPATH 选项,应该为创建的所有有效证书创建一个目录,然后使用
openssl
附带的c_rehash
脚本“准备”该目录。
如果不使用 c_rehash 程序,curl将忽略您设置的目录中的任何文件。
c_rehash 命令貌似只有 linux 上安装 openssl-perl 后可以使用
SSL认证客户端相关的选项
选项 | 值类型 | 默认 | 备注 |
---|---|---|---|
CURLOPT_SSLCERT | 字符串 | 无 | 一个包含 PEM 格式证书的文件名。 |
CURLOPT_SSLCERTPASSWD | 字符串 | 无 | 使用 CURLOPT_SSLCERT 证书需要的密码。 |
CURLOPT_SSLCERTTYPE | 字符串 | PEM | 证书的类型。支持的格式有 PEM (默认值), DER 和 ENG 。 |
CURLOPT_SSLKEY | 字符串 | 无 | 包含 SSL 私钥的文件名。 |
CURLOPT_SSLKEYPASSWD | 字符串 | 无 | 在 CURLOPT_SSLKEY 中指定了的 SSL 私钥的密码。 |
CURLOPT_SSLKEYTYPE | 字符串 | PEM | CURLOPT_SSLKEY 中规定的私钥的加密类型,支持的密钥类型为 PEM (默认值)、DER 和 ENG |
HTTP相关的选项
选项 | 值类型 | 默认 | 备注 |
---|---|---|---|
CURLOPT_HTTP_VERSION | 整数 | CURL_HTTP_VERSION_NONE (让 cURL 自己判断使用哪个版本) |
CURL_HTTP_VERSION_1_0 、 CURL_HTTP_VERSION_1_1 或 CURL_HTTP_VERSION_2_0 ,强制使用 HTTP/1.0 、HTTP/1.1 、 HTTP/2.0 。 |
CURLOPT_HTTPAUTH | 整数 | 使用的 HTTP 验证方法。选项有: CURLAUTH_BASIC 、 CURLAUTH_DIGEST 、CURLAUTH_GSSNEGOTIATE 、 CURLAUTH_NTLM 、 CURLAUTH_ANY 和 CURLAUTH_ANYSAFE 。可以使用 | 位操作符结合多个值,cURL 会让服务器选择受支持的方法,并选择最好的那个。CURLAUTH_ANY 是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。 |
curl_setopt_array
批量设置选项
curl_setopt_array ( resource $ch , array $options ) : bool
ch
由
curl_init()
返回的cURL
句柄。options
一个
array
用来确定将被设置的选项及其值。数组的键值必须是一个有效的curl_setopt()
常量或者是它们对等的整数值。
为 cURL
传输会话批量设置选项。这个函数对于需要设置大量的 cURL
选项是非常有用的,不需要重复地调用 curl_setopt()
。
如果全部的选项都被成功设置,返回 TRUE
。如果一个选项不能被成功设置,马上返回 FALSE
,忽略其后的任何在 options
数组中的选项。
curl_getinfo
获取最后一次传输的相关信息
curl_getinfo ( resource $ch [, int $opt = 0 ] ) : mixed
ch
由
curl_init()
返回的cURL
句柄。opt
这个参数可能是以下常量之一:
- CURLINFO_EFFECTIVE_URL - 最后一个有效的URL地址
- CURLINFO_HTTP_CODE - 最后一个收到的HTTP代码
- CURLINFO_FILETIME - 远程获取文档的时间,如果无法获取,则返回值为“-1”
- CURLINFO_TOTAL_TIME - 最后一次传输所消耗的时间
- CURLINFO_NAMELOOKUP_TIME - 名称解析所消耗的时间
- CURLINFO_CONNECT_TIME - 建立连接所消耗的时间
- CURLINFO_PRETRANSFER_TIME - 从建立连接到准备传输所使用的时间
- CURLINFO_STARTTRANSFER_TIME - 从建立连接到传输开始所使用的时间
- CURLINFO_REDIRECT_TIME - 在事务传输开始前重定向所使用的时间
- CURLINFO_SIZE_UPLOAD - 以字节为单位返回上传数据量的总值
- CURLINFO_SIZE_DOWNLOAD - 以字节为单位返回下载数据量的总值
- CURLINFO_SPEED_DOWNLOAD - 平均下载速度
- CURLINFO_SPEED_UPLOAD - 平均上传速度
- CURLINFO_HEADER_SIZE - header部分的大小
- CURLINFO_HEADER_OUT - 发送请求的字符串
- CURLINFO_REQUEST_SIZE - 在HTTP请求中有问题的请求的大小
- CURLINFO_SSL_VERIFYRESULT - 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
- CURLINFO_CONTENT_LENGTH_DOWNLOAD - 从Content-Length: field中读取的下载内容长度
- CURLINFO_CONTENT_LENGTH_UPLOAD - 上传内容大小的说明
- CURLINFO_CONTENT_TYPE - 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type: header
如果 opt
被设置,以字符串形式返回它的值。否则,返回返回一个包含下列元素的关联数组(它们分别对应于 opt
):
- “url”
- “content_type”
- “http_code”
- “header_size”
- “request_size”
- “filetime”
- “ssl_verify_result”
- “redirect_count”
- “total_time”
- “namelookup_time”
- “connect_time”
- “pretransfer_time”
- “size_upload”
- “size_download”
- “speed_download”
- “speed_upload”
- “download_content_length”
- “upload_content_length”
- “starttransfer_time”
- “redirect_time”
curl_version
获取 cURL 的版本信息
curl_version ([ int $age = CURLVERSION_NOW ] ) : array
age
官方文档没有说明,未知
返回一个关于 cURL 版本的信息的关联数组,包含如下元素:
数组索引 | 说明 |
---|---|
Indice | 值描述 |
version_number | cURL 24 位版本号 |
version | cURL 版本号,字符串形式 |
ssl_version_number | OpenSSL 24 位版本号 |
ssl_version | OpenSSL 版本号,字符串形式 |
libz_version | zlib 版本号,字符串形式 |
host | 关于编译cURL主机的信息 |
age | 官方文档没有说明,未知 |
features | 一个CURL_VERSION_XXX常量的位掩码 |
protocols | 数组,包含 cURL 支持的协议名称 |