curl_setopt

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

curl_setopt为 cURL 传输设置选项

描述

curl_setopt(CurlHandle $handle, int $option, mixed $value): bool

在给定的 cURL 会话句柄上设置选项。

参数

handle

curl_init() 返回的 cURL 句柄。

option

要设置的 CURLOPT_XXX 选项。

value

要在 option 上设置的值。

对于以下 option 参数的值,value 应为 bool

选项 value 设置为 说明
CURLOPT_AUTOREFERER true 自动设置 Referer: 字段,该字段在请求中跟随 Location: 重定向。
CURLOPT_COOKIESESSION true 将此标记为新的 cookie “会话”。它将强制 libcurl 忽略它即将加载的所有 cookie,这些 cookie 是来自先前会话的“会话 cookie”。默认情况下,libcurl 始终存储和加载所有 cookie,而不管它们是会话 cookie 还是非会话 cookie。会话 cookie 是没有过期日期的 cookie,它们旨在仅在此“会话”中保持活动和存在。
CURLOPT_CERTINFO true 将 SSL 证书信息输出到在安全传输上输出到STDERR 在 cURL 7.19.1 中添加。需要CURLOPT_VERBOSE 才能生效。
CURLOPT_CONNECT_ONLY true 指示库执行所有必需的代理身份验证和连接设置,但不会进行数据传输。此选项已针对 HTTP、SMTP 和 POP3 实现。 在 7.15.2 中添加。
CURLOPT_CRLF true 将 Unix 换行符转换为 CRLF 换行符。
CURLOPT_DISALLOW_USERNAME_IN_URL true 不允许包含用户名的 URL。默认情况下允许用户名 (0)。 在 cURL 7.61.0 中添加。自 PHP 7.3.0 起可用。
CURLOPT_DNS_SHUFFLE_ADDRESSES true 对所有返回的地址的顺序进行随机排列,以便在解析名称并返回多个 IP 地址时,它们将以随机顺序使用。这可能导致 IPv4 在 IPv6 之前使用或反之亦然。 在 cURL 7.60.0 中添加。自 PHP 7.3.0 起可用。
CURLOPT_HAPROXYPROTOCOL true 在连接开始时发送 HAProxy PROXY 协议 v1 标头。默认操作是不发送此标头。 在 cURL 7.60.0 中添加。自 PHP 7.3.0 起可用。
CURLOPT_SSH_COMPRESSION true 启用内置 SSH 压缩。这是一个请求,而不是命令;服务器可能执行也可能不执行。 在 cURL 7.56.0 中添加。自 PHP 7.3.0 起可用。
CURLOPT_DNS_USE_GLOBAL_CACHE true 使用全局 DNS 缓存。此选项不是线程安全的。如果 PHP 构建用于非线程使用(CLI、FCGI、Apache2-Prefork 等),则默认情况下会条件启用它。
CURLOPT_FAILONERROR true 如果返回的 HTTP 代码大于或等于 400,则详细地失败。默认行为是正常返回页面,忽略代码。
CURLOPT_SSL_FALSESTART true 启用 TLS 假启动。 在 cURL 7.42.0 中添加。自 PHP 7.0.7 起可用。
CURLOPT_FILETIME true 尝试检索远程文档的修改日期。可以使用 curl_getinfo()CURLINFO_FILETIME 选项检索此值。
CURLOPT_FOLLOWLOCATION true 跟随服务器作为 HTTP 标头一部分发送的任何 "Location: " 标头。另请参见CURLOPT_MAXREDIRS
CURLOPT_FORBID_REUSE true 强制连接在完成处理后显式关闭,而不是被池化以供重用。
CURLOPT_FRESH_CONNECT true 强制使用新连接而不是缓存连接。
CURLOPT_FTP_USE_EPRT true 在进行主动 FTP 下载时使用 EPRT(和 LPRT)。使用false 禁用 EPRT 和 LPRT,仅使用 PORT。
CURLOPT_FTP_USE_EPSV true 在恢复到 PASV 之前先尝试对 FTP 传输使用 EPSV 命令。设置为false 禁用 EPSV。
CURLOPT_FTP_CREATE_MISSING_DIRS true 在 FTP 操作遇到当前不存在的路径时创建缺少的目录。
CURLOPT_FTPAPPEND true 附加到远程文件而不是覆盖它。
CURLOPT_TCP_NODELAY true 禁用 TCP 的 Nagle 算法,该算法试图最小化网络上的小数据包数量。 适用于使用 libcurl 7.11.2 或更高版本编译的版本。
CURLOPT_FTPASCII CURLOPT_TRANSFERTEXT 的别名。请改用它。
CURLOPT_FTPLISTONLY true 仅列出 FTP 目录的名称。
CURLOPT_HEADER true 在输出中包含标头。
CURLINFO_HEADER_OUT true 跟踪句柄的请求字符串。 CURLINFO_ 前缀是故意的。
CURLOPT_HTTP09_ALLOWED 是否允许 HTTP/0.9 响应。自 libcurl 7.66.0 起默认为false;以前它默认为true 如果针对 libcurl >= 7.64.0 构建,则自 PHP 7.3.15 和 7.4.3 起可用。
CURLOPT_HTTPGET true 将 HTTP 请求方法重置为 GET。由于 GET 是默认值,因此仅在请求方法已更改时才需要这样做。
CURLOPT_HTTPPROXYTUNNEL true 通过给定的 HTTP 代理进行隧道。
CURLOPT_HTTP_CONTENT_DECODING false 获取原始 HTTP 响应主体。 如果针对 libcurl >= 7.16.2 构建,则可用。
CURLOPT_KEEP_SENDING_ON_ERROR true 如果返回的 HTTP 代码等于或大于 300,则继续发送请求主体。默认操作是停止发送并关闭流或连接。适用于手动 NTLM 身份验证。大多数应用程序不需要此选项。 如果针对 libcurl >= 7.51.0 构建,则自 PHP 7.3.0 起可用。
CURLOPT_MUTE true 在 cURL 函数方面保持完全静默。 在 cURL 7.15.5 中删除(您可以改用 CURLOPT_RETURNTRANSFER)
CURLOPT_NETRC true 扫描 ~/.netrc 文件以查找正在建立连接的远程站点的用户名和密码。
CURLOPT_NOBODY true 从输出中排除主体。请求方法然后设置为 HEAD。将其更改为false 不会将其更改为 GET。
CURLOPT_NOPROGRESS

true 禁用 cURL 传输的进度指示器。

注意:

PHP 会自动将此选项设置为true,这仅应在调试时更改。

CURLOPT_NOSIGNAL true 忽略导致向 PHP 进程发送信号的任何 cURL 函数。这在多线程 SAPI 中默认启用,因此仍然可以使用超时选项。 在 cURL 7.10 中添加。
CURLOPT_PATH_AS_IS true 不处理点点序列。 在 cURL 7.42.0 中添加。自 PHP 7.0.7 起可用。
CURLOPT_PIPEWAIT true 等待管道/多路复用。 在 cURL 7.43.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_POST true 用于执行常规 HTTP POST。此 POST 是最常用于 HTML 表单的普通 application/x-www-form-urlencoded 类型。
CURLOPT_PUT true 用于 HTTP PUT 文件。要 PUT 的文件必须使用 CURLOPT_INFILECURLOPT_INFILESIZE 设置。
CURLOPT_RETURNTRANSFER true 用于将传输作为 curl_exec() 返回值的字符串返回,而不是直接输出。
CURLOPT_SASL_IR true 用于启用在第一个数据包中发送初始响应。 在 cURL 7.31.10 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_SSL_ENABLE_ALPN false 用于在 SSL 握手过程中禁用 ALPN(如果 SSL 后端 libcurl 构建为使用支持它),这可以用来协商 http2。 在 cURL 7.36.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_SSL_ENABLE_NPN false 用于在 SSL 握手过程中禁用 NPN(如果 SSL 后端 libcurl 构建为使用支持它),这可以用来协商 http2。 在 cURL 7.36.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_SSL_VERIFYPEER false 用于阻止 cURL 验证对等方的证书。可以使用 CURLOPT_CAINFO 选项指定要验证的备用证书,或者可以使用 CURLOPT_CAPATH 选项指定证书目录。 从 cURL 7.10 开始,默认情况下为 true。从 cURL 7.10 开始安装默认捆绑包。
CURLOPT_SSL_VERIFYSTATUS true 用于验证证书的状态。 在 cURL 7.41.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_PROXY_SSL_VERIFYPEER false 用于阻止 cURL 验证对等方的证书。可以使用 CURLOPT_CAINFO 选项指定要验证的备用证书,或者可以使用 CURLOPT_CAPATH 选项指定证书目录。当设置为 false 时,无论如何对等方证书验证都会成功。 默认情况下为 true。从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_SAFE_UPLOAD 始终为 true,这会禁用对 CURLOPT_POSTFIELDS 中上传文件的 @ 前缀的支持,这意味着以 @ 开头的值可以安全地作为字段传递。可以使用 CURLFile 进行上传。
CURLOPT_SUPPRESS_CONNECT_HEADERS true 用于从用户回调函数 CURLOPT_HEADERFUNCTIONCURLOPT_WRITEFUNCTION 中抑制代理 CONNECT 响应头,当使用 CURLOPT_HTTPPROXYTUNNEL 并发出 CONNECT 请求时。 在 cURL 7.54.0 中添加。从 PHP 7.3.0 开始可用。
CURLOPT_TCP_FASTOPEN true 用于启用 TCP Fast Open。 在 cURL 7.49.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_TFTP_NO_OPTIONS true 用于不发送 TFTP 选项请求。 在 cURL 7.48.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_TRANSFERTEXT true 用于 FTP 传输使用 ASCII 模式。对于 LDAP,它以纯文本而不是 HTML 检索数据。在 Windows 系统上,它不会将 STDOUT 设置为二进制模式。
CURLOPT_UNRESTRICTED_AUTH true 用于在遵循位置(使用 CURLOPT_FOLLOWLOCATION)时,即使主机名已更改,也要继续发送用户名和密码。
CURLOPT_UPLOAD true 用于准备上传。
CURLOPT_VERBOSE true 用于输出详细的信息。将输出写入 STDERR,或使用 CURLOPT_STDERR 指定的文件。

value 应该是一个 int,用于以下 option 参数的值

选项 value 设置为 说明
CURLOPT_BUFFERSIZE 用于每次读取的缓冲区大小。不能保证此请求将得到满足,但是。 在 cURL 7.10 中添加。
CURLOPT_CONNECTTIMEOUT 尝试连接时等待的秒数。使用 0 表示无限期等待。
CURLOPT_CONNECTTIMEOUT_MS 尝试连接时等待的毫秒数。使用 0 表示无限期等待。如果 libcurl 构建为使用标准系统名称解析器,则连接的那部分将仍然使用完整秒分辨率进行超时,允许最短超时为一秒。 在 cURL 7.16.2 中添加。
CURLOPT_DNS_CACHE_TIMEOUT 将 DNS 条目保存在内存中的秒数。默认情况下,此选项设置为 120(2 分钟)。
CURLOPT_EXPECT_100_TIMEOUT_MS 以毫秒为单位的 Expect: 100-continue 响应的超时时间。默认为 1000 毫秒。 在 cURL 7.36.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 用于 happy eyeballs 算法的 ipv6 的提前量。Happy eyeballs 尝试连接到双栈主机的 IPv4 和 IPv6 地址,在超时毫秒内优先使用 IPv6。默认为 CURL_HET_DEFAULT,目前为 200 毫秒。 在 cURL 7.59.0 中添加。从 PHP 7.3.0 开始可用。
CURLOPT_FTPSSLAUTH FTP 身份验证方法(当被激活时):CURLFTPAUTH_SSL(首先尝试 SSL),CURLFTPAUTH_TLS(首先尝试 TLS),或 CURLFTPAUTH_DEFAULT(让 cURL 决定)。 在 cURL 7.12.2 中添加。
CURLOPT_HEADEROPT

如何处理标题。以下常量之一

CURLHEADER_UNIFIED
CURLOPT_HTTPHEADER 中指定的标题将在请求服务器和代理时使用。启用此选项后,CURLOPT_PROXYHEADER 将不会产生任何影响。
CURLHEADER_SEPARATE
使 CURLOPT_HTTPHEADER 标题仅发送到服务器,而不是代理。代理标题必须使用 CURLOPT_PROXYHEADER 设置才能使用。请注意,如果将非 CONNECT 请求发送到代理,libcurl 将发送服务器标题和代理标题。在执行 CONNECT 时,libcurl 将仅将 CURLOPT_PROXYHEADER 标题发送到代理,然后将 CURLOPT_HTTPHEADER 标题发送到服务器。

从 cURL 7.42.1 开始,默认值为 CURLHEADER_SEPARATE,之前为 CURLHEADER_UNIFIED
在 cURL 7.37.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE(默认,让 CURL 决定使用哪个版本),CURL_HTTP_VERSION_1_0(强制使用 HTTP/1.0),CURL_HTTP_VERSION_1_1(强制使用 HTTP/1.1),CURL_HTTP_VERSION_2_0(尝试 HTTP 2),CURL_HTTP_VERSION_2CURL_HTTP_VERSION_2_0 的别名),CURL_HTTP_VERSION_2TLS(尝试仅通过 TLS(HTTPS)使用 HTTP 2)或 CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE(使用 HTTP/2 而不是 HTTP/1.1 Upgrade 发出非 TLS HTTP 请求)。
CURLOPT_HTTPAUTH

要使用的 HTTP 身份验证方法。选项包括:CURLAUTH_BASICCURLAUTH_DIGESTCURLAUTH_GSSNEGOTIATECURLAUTH_NTLMCURLAUTH_AWS_SIGV4CURLAUTH_ANYCURLAUTH_ANYSAFE

可以使用按位 |(或)运算符组合多个方法。如果这样做,cURL 将轮询服务器以查看它支持哪些方法并选择最佳方法。

CURLAUTH_ANY 设置所有位。cURL 将自动选择它认为最安全的方法。

CURLAUTH_ANYSAFE 设置除 CURLAUTH_BASIC 之外的所有位。cURL 将自动选择它认为最安全的方法。

CURLOPT_INFILESIZE 将文件上传到远程站点时,文件的预期大小(以字节为单位)。请注意,使用此选项不会阻止 libcurl 发送更多数据,因为发送的确切内容取决于 CURLOPT_READFUNCTION
CURLOPT_LOW_SPEED_LIMIT CURLOPT_LOW_SPEED_TIME 秒内,传输速度应该低于每秒多少字节,在此之后 PHP 会认为传输速度太慢并中止。
CURLOPT_LOW_SPEED_TIME 传输速度应该低于 CURLOPT_LOW_SPEED_LIMIT 多少秒,在此之后 PHP 会认为传输速度太慢并中止。
CURLOPT_MAIL_RCPT_ALLLOWFAILS 允许 RCPT TO 命令对某些收件人失败。 在将数据发送到多个收件人时,默认情况下,如果至少有一个收件人导致 RCPT TO 命令返回错误,cURL 将中止 SMTP 会话。此选项告诉 cURL 忽略错误并继续处理剩余的有效收件人。如果所有收件人都触发 RCPT TO 失败且设置了此标志,cURL 将中止 SMTP 会话并返回从最后一个 RCPT TO 命令接收到的错误。
CURLOPT_MAXAGE_CONN 允许将现有连接视为可重用连接的最大空闲时间。默认最大时长设置为 118 秒。
CURLOPT_MAXFILESIZE_LARGE 允许下载的最大文件大小(以字节为单位)。如果找到请求的文件大小超过此值,传输将不会开始,并且将返回 CURLE_FILESIZE_EXCEEDED。在下载之前并不总是知道文件大小,对于此类文件,即使文件传输最终大于此给定的限制,此选项也无效。
CURLOPT_MAXLIFETIME_CONN 自连接创建起,允许现有连接视为可重用连接的最大时间(以秒为单位)。如果在缓存中找到的连接比此值旧,则一旦所有正在进行的传输完成,该连接将被关闭。默认值为 0 秒,这意味着此选项被禁用,并且所有连接都有资格被重用。
CURLOPT_MAXCONNECTS 允许的最大持久连接数。当达到限制时,缓存中最旧的连接将被关闭,以防止打开的连接数增加。
CURLOPT_MAXREDIRS 要遵循的 HTTP 重定向的最大数量。将此选项与 **CURLOPT_FOLLOWLOCATION** 一起使用。默认值为 20,用于防止无限重定向。设置为 -1 允许无限重定向,0 拒绝所有重定向。
CURLOPT_PORT 要连接的备用端口号。
CURLOPT_POSTREDIR 如果设置了 **CURLOPT_FOLLOWLOCATION** 并且发生了特定类型的重定向,则应保留 HTTP POST 方法的 1(301 Moved Permanently)、2(302 Found)和 4(303 See Other)的位掩码。 在 cURL 7.19.1 中添加。
CURLOPT_PROTOCOLS

**CURLPROTO_*** 值的位掩码。如果使用,此位掩码将限制 libcurl 在传输中可能使用的协议。这允许您构建一个支持广泛协议的 libcurl,但仍然限制特定传输仅允许使用其中的一部分。默认情况下,libcurl 将接受它支持的所有协议。另请参见 **CURLOPT_REDIR_PROTOCOLS**。

有效的协议选项为:**CURLPROTO_HTTP**、**CURLPROTO_HTTPS**、**CURLPROTO_FTP**、**CURLPROTO_FTPS**、**CURLPROTO_SCP**、**CURLPROTO_SFTP**、**CURLPROTO_TELNET**、**CURLPROTO_LDAP**、**CURLPROTO_LDAPS**、**CURLPROTO_DICT**、**CURLPROTO_FILE**、**CURLPROTO_TFTP**、**CURLPROTO_MQTT**、**CURLPROTO_ALL**

在 cURL 7.19.4 中添加。
CURLOPT_PROXYAUTH 用于代理连接的 HTTP 身份验证方法。使用与 **CURLOPT_HTTPAUTH** 中描述的相同的位掩码。对于代理身份验证,目前仅支持 **CURLAUTH_BASIC** 和 **CURLAUTH_NTLM**。 在 cURL 7.10.7 中添加。
CURLOPT_PROXYPORT 要连接到的代理的端口号。此端口号也可以在 **CURLOPT_PROXY** 中设置。
CURLOPT_PROXYTYPE **CURLPROXY_HTTP**(默认)、**CURLPROXY_SOCKS4**、**CURLPROXY_SOCKS5**、**CURLPROXY_SOCKS4A** 或 **CURLPROXY_SOCKS5_HOSTNAME** 之一。 在 cURL 7.10 中添加。
CURLOPT_REDIR_PROTOCOLS **CURLPROTO_*** 值的位掩码。如果使用,此位掩码将限制 libcurl 在启用 **CURLOPT_FOLLOWLOCATION** 时重定向到其遵循的传输中可能使用的协议。这允许您限制特定传输仅允许在重定向中使用一部分协议。默认情况下,libcurl 将允许除 FILE 和 SCP 之外的所有协议。这与 7.19.4 之前的版本不同,后者会无条件地遵循所有支持的协议。有关协议常数值,另请参见 **CURLOPT_PROTOCOLS**。 在 cURL 7.19.4 中添加。
CURLOPT_RESUME_FROM 要从中恢复传输的偏移量(以字节为单位)。
CURLOPT_SOCKS5_AUTH

要使用的 SOCKS5 身份验证方法。选项包括:**CURLAUTH_BASIC**、**CURLAUTH_GSSAPI**、**CURLAUTH_NONE**。

可以使用按位 |(或)运算符组合多个方法。如果这样做,cURL 将轮询服务器以查看它支持哪些方法并选择最佳方法。

**CURLAUTH_BASIC** 允许用户名/密码身份验证。

**CURLAUTH_GSSAPI** 允许 GSS-API 身份验证。

**CURLAUTH_NONE** 不允许身份验证。

默认值为 CURLAUTH_BASIC|CURLAUTH_GSSAPI。使用 **CURLOPT_PROXYUSERPWD** 选项设置实际的用户名和密码。

从 7.3.0 和 curl >= 7.55.0 开始可用。
CURLOPT_SSL_OPTIONS

设置 SSL 行为选项,它是由以下常量组成的位掩码

CURLSSLOPT_ALLOW_BEAST
不要尝试使用任何解决 SSL3 和 TLS1.0 协议中安全漏洞的解决方法。
CURLSSLOPT_NO_REVOKE
禁用那些支持此行为的 SSL 后端的证书吊销检查。
CURLSSLOPT_AUTO_CLIENT_CERT
在服务器请求时自动查找并使用用于身份验证的客户端证书。此选项仅受 Schannel(本机 Windows SSL 库)支持。
CURLSSLOPT_NATIVE_CA
使用操作系统的本机 CA 存储进行证书验证。仅在使用 OpenSSL 构建时才在 Windows 上有效。

注意 此选项为实验性选项,行为可能会发生变化。

CURLSSLOPT_NO_PARTIALCHAIN
不接受“部分”证书链,而 cURL 默认情况下会接受。此选项仅受 OpenSSL 支持,如果链以中间证书而不是以根证书结尾,则证书验证将失败。
CURLSSLOPT_REVOKE_BEST_EFFORT
如果缺少或离线分发点,则忽略那些支持此行为的 SSL 后端的证书吊销检查。此选项仅受 Schannel(本机 Windows SSL 库)支持。

注意 如果与 **CURLSSLOPT_NO_REVOKE** 结合使用,则后者优先。

在 cURL 7.25.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_SSL_VERIFYHOST 2 用于验证 SSL 对等证书中的通用名字段或主题备用名称字段是否与提供的主机名匹配。 0 表示不检查名称。 1 不应使用。在生产环境中,此选项的值应保持为 2(默认值)。 在 cURL 7.28.1 中删除对值 1 的支持。
CURLOPT_SSLVERSION

以下之一:CURL_SSLVERSION_DEFAULTCURL_SSLVERSION_TLSv1CURL_SSLVERSION_SSLv2CURL_SSLVERSION_SSLv3CURL_SSLVERSION_TLSv1_0CURL_SSLVERSION_TLSv1_1CURL_SSLVERSION_TLSv1_2CURL_SSLVERSION_TLSv1_3

可以使用其中一个 **CURL_SSLVERSION_MAX_*** 常量来设置最大 TLS 版本。

也可以将其中一个 **CURL_SSLVERSION_*** 常量与其中一个 **CURL_SSLVERSION_MAX_*** 常量进行按位或运算。 CURL_SSLVERSION_MAX_DEFAULT(库支持的最大版本)、CURL_SSLVERSION_MAX_TLSv1_0CURL_SSLVERSION_MAX_TLSv1_1CURL_SSLVERSION_MAX_TLSv1_2CURL_SSLVERSION_MAX_TLSv1_3

警告

最好不要设置此选项,保留默认设置。因为考虑到 SSLv2 和 SSLv3 中已知的漏洞,将此选项设置为 **CURL_SSLVERSION_SSLv2** 或 **CURL_SSLVERSION_SSLv3** 非常危险。

CURLOPT_PROXY_SSL_OPTIONS

设置代理 SSL 行为选项,它是由以下常量组成的位掩码

CURLSSLOPT_ALLOW_BEAST
不要尝试使用任何解决 SSL3 和 TLS1.0 协议中安全漏洞的解决方法。
CURLSSLOPT_NO_REVOKE
禁用那些支持此行为的 SSL 后端的证书吊销检查。(curl >= 7.44.0)
CURLSSLOPT_NO_PARTIALCHAIN
不接受“部分”证书链,而它默认情况下会接受。(curl >= 7.68.0)

从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_SSL_VERIFYHOST 设置为 2 用于在 HTTPS 代理的证书名称字段中验证代理名称。当设置为 0 时,无论证书中使用的名称如何,连接都会成功。谨慎使用此功能!1 在 curl 7.28.0 及更早版本中被视为调试选项。从 curl 7.28.1 到 7.65.3 会返回 **CURLE_BAD_FUNCTION_ARGUMENT**。从 curl 7.66.0 开始,12 被视为相同的值。在生产环境中,此选项的值应保持为 2(默认值)。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_SSLVERSION

以下之一:CURL_SSLVERSION_DEFAULTCURL_SSLVERSION_TLSv1CURL_SSLVERSION_TLSv1_0CURL_SSLVERSION_TLSv1_1CURL_SSLVERSION_TLSv1_2CURL_SSLVERSION_TLSv1_3CURL_SSLVERSION_MAX_DEFAULTCURL_SSLVERSION_MAX_TLSv1_0CURL_SSLVERSION_MAX_TLSv1_1CURL_SSLVERSION_MAX_TLSv1_2CURL_SSLVERSION_MAX_TLSv1_3CURL_SSLVERSION_SSLv3

警告

最好不要设置此选项,保留默认的 **CURL_SSLVERSION_DEFAULT**,它将尝试找出远程 SSL 协议版本。

从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_STREAM_WEIGHT 设置数值流权重(介于 1 和 256 之间的数字)。 在 cURL 7.46.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_TCP_KEEPALIVE 如果设置为 1,将发送 TCP 保持活动探测。这些探测的延迟和频率可以通过 **CURLOPT_TCP_KEEPIDLE** 和 **CURLOPT_TCP_KEEPINTVL** 选项控制,前提是操作系统支持它们。如果设置为 0(默认),则禁用保持活动探测。 在 cURL 7.25.0 中添加。
CURLOPT_TCP_KEEPIDLE 设置操作系统在启用 **CURLOPT_TCP_KEEPALIVE** 后等待连接处于空闲状态的时间(以秒为单位),然后再发送保持活动探测。并非所有操作系统都支持此选项。默认值为 60 在 cURL 7.25.0 中添加。
CURLOPT_TCP_KEEPINTVL 设置操作系统在启用 **CURLOPT_TCP_KEEPALIVE** 后等待的时间间隔(以秒为单位),然后再发送保持活动探测。并非所有操作系统都支持此选项。默认值为 60 在 cURL 7.25.0 中添加。
CURLOPT_TIMECONDITION CURLOPT_TIMEVALUE 的处理方式。使用 CURL_TIMECOND_IFMODSINCE 仅在页面自 CURLOPT_TIMEVALUE 中指定的时间以来已被修改时返回页面。如果页面未被修改,则假设 CURLOPT_HEADERtrue,将返回 "304 Not Modified" 头。使用 CURL_TIMECOND_IFUNMODSINCE 获得相反的效果。使用 CURL_TIMECOND_NONE 忽略 CURLOPT_TIMEVALUE 并始终返回页面。CURL_TIMECOND_NONE 是默认值。 在 cURL 7.46.0 之前,默认值为 CURL_TIMECOND_IFMODSINCE
CURLOPT_TIMEOUT 允许 cURL 函数执行的最大秒数。
CURLOPT_TIMEOUT_MS 允许 cURL 函数执行的最大毫秒数。如果 libcurl 构建为使用标准系统名称解析器,则连接的该部分仍将使用全秒分辨率进行超时,最小超时时间为一秒。 在 cURL 7.16.2 中添加。
CURLOPT_TIMEVALUE 自 1970 年 1 月 1 日以来的秒数。时间将由 CURLOPT_TIMECONDITION 使用。
CURLOPT_TIMEVALUE_LARGE 自 1970 年 1 月 1 日以来的秒数。时间将由 CURLOPT_TIMECONDITION 使用。默认值为零。此选项与 CURLOPT_TIMEVALUE 之间的区别在于参数的类型。在 'long' 仅为 32 位宽的系统上,必须使用此选项设置 2038 年之后的日期。 在 cURL 7.59.0 中添加。从 PHP 7.3.0 开始可用。
CURLOPT_UPKEEP_INTERVAL_MS 某些协议具有“连接维护”机制。这些机制通常在现有连接上发送一些流量以保持连接活动。此选项定义连接维护间隔。目前,唯一具有连接维护机制的协议是 HTTP/2。当连接维护间隔超过时,将在连接上发送 HTTP/2 PING 帧。默认值为 60 秒。
CURLOPT_UPLOAD_BUFFERSIZE cURL 上传缓冲区的首选缓冲区大小(以字节为单位)。上传缓冲区的大小默认为 64 千字节。允许设置的最大缓冲区大小为 2 兆字节。允许设置的最小缓冲区大小为 16 千字节。
CURLOPT_MAX_RECV_SPEED_LARGE 如果下载在传输期间的累积平均值超过此速度(以每秒字节为单位),则传输将暂停以将平均速率保持在参数值以下或等于参数值。默认为无限制速度。 在 cURL 7.15.5 中添加。
CURLOPT_MAX_SEND_SPEED_LARGE 如果上传在传输期间的累积平均值超过此速度(以每秒字节为单位),则传输将暂停以将平均速率保持在参数值以下或等于参数值。默认为无限制速度。 在 cURL 7.15.5 中添加。
CURLOPT_SSH_AUTH_TYPES 一个位掩码,包含一个或多个 CURLSSH_AUTH_PUBLICKEYCURLSSH_AUTH_PASSWORDCURLSSH_AUTH_HOSTCURLSSH_AUTH_KEYBOARD。设置为 CURLSSH_AUTH_ANY 允许 libcurl 选择一个。 在 cURL 7.16.1 中添加。
CURLOPT_IPRESOLVE 允许应用程序选择在解析主机名时使用哪种 IP 地址。这只有在使用主机名解析使用多个 IP 版本的地址时才有意义,可能的取值是 CURL_IPRESOLVE_WHATEVERCURL_IPRESOLVE_V4CURL_IPRESOLVE_V6,默认值为 CURL_IPRESOLVE_WHATEVER 在 cURL 7.10.8 中添加。
CURLOPT_FTP_FILEMETHOD 告诉 curl 使用哪种方法来访问 FTP(S) 服务器上的文件。可能的取值是 CURLFTPMETHOD_DEFAULTCURLFTPMETHOD_MULTICWDCURLFTPMETHOD_NOCWDCURLFTPMETHOD_SINGLECWD 在 cURL 7.15.1 中添加。

value 对于 option 参数的以下值应为 string

选项 value 设置为 说明
CURLOPT_ABSTRACT_UNIX_SOCKET 启用使用抽象 Unix 域套接字而不是建立到主机的 TCP 连接,并将路径设置为给定的 string。此选项与 CURLOPT_UNIX_SOCKET_PATH 具有相同的语义。这两个选项共享相同的存储空间,因此每个句柄只能设置其中一个。 自 PHP 7.3.0 和 cURL 7.53.0 起可用
CURLOPT_ALTSVC 传递 cURL 用作 Alt-Svc 缓存文件的文件名,以便从缓存文件读取现有缓存内容,并在传输后可能写回缓存文件,除非 CURLALTSVC_READONLYFILE 通过 CURLOPT_ALTSVC_CTRL 设置。
CURLOPT_ALTSVC_CTRL 使用此句柄进行传输时,使用正确的功能集填充位掩码,以指示 cURL 如何处理 Alt-Svc。cURL 仅接受 HTTPS 上的 Alt-Svc 头。它还将仅完成对备用原点的请求,前提是该原点在 HTTPS 上正确托管。设置任何位将启用 alt-svc 引擎。选项包括:CURLALTSVC_H1CURLALTSVC_H2CURLALTSVC_H3CURLALTSVC_READONLYFILE
CURLOPT_AWS_SIGV4

在 HTTP(S) 头上提供 AWS V4 签名身份验证。

此选项将覆盖在 CURLOPT_HTTPAUTH 中设置的任何其他身份验证类型。此方法不能与其他身份验证类型结合使用。

CURLOPT_CAINFO 包含一个或多个证书的文件名,用于验证对等方。这只有在与 CURLOPT_SSL_VERIFYPEER 结合使用时才有意义。 可能需要绝对路径。
CURLOPT_CAINFO_BLOB 包含一个或多个证书的 PEM 文件的名称,用于验证对等方。此选项将覆盖 CURLOPT_CAINFO 自 PHP 8.2.0 和 cURL 7.77.0 起可用
CURLOPT_CAPATH 包含多个 CA 证书的目录。将此选项与 CURLOPT_SSL_VERIFYPEER 结合使用。
CURLOPT_COOKIE 将在 HTTP 请求中使用的 "Cookie: " 头的内容。请注意,多个 cookie 用分号和空格隔开(例如,“fruit=apple; colour=red”)。
CURLOPT_COOKIEFILE 包含 cookie 数据的文件名。cookie 文件可以是 Netscape 格式,也可以是简单地将 HTTP 样式的头转储到文件中。如果名称为空字符串,则不会加载任何 cookie,但 cookie 处理仍然启用。
CURLOPT_COOKIEJAR 要将所有内部 cookie 保存到的文件名,当句柄的析构函数被调用时。
警告

自 PHP 8.0.0 起,curl_close() 为无操作,并且 *不会* 销毁句柄。如果需要在句柄自动销毁之前写入 cookie,请对句柄调用 unset()

CURLOPT_COOKIELIST cookie 字符串(即 Netscape/Mozilla 格式的单行,或常规 HTTP 样式的 Set-Cookie 头)将该单个 cookie 添加到内部 cookie 存储区。"ALL" 会擦除内存中保存的所有 cookie。"SESS" 会擦除内存中保存的所有会话 cookie。"FLUSH" 会将所有已知 cookie 写入由 CURLOPT_COOKIEJAR 指定的文件。"RELOAD" 会从由 CURLOPT_COOKIEFILE 指定的文件加载所有 cookie。 自 cURL 7.14.1 起可用。
CURLOPT_CUSTOMREQUEST

在进行 HTTP 请求时,使用的一个自定义请求方法,而不是 "GET""HEAD"。这对于进行 "DELETE" 或其他更模糊的 HTTP 请求很有用。有效值为 "GET""POST""CONNECT" 等;即不要在此处输入完整的 HTTP 请求行。例如,输入 "GET /index.html HTTP/1.0\r\n\r\n" 将是不正确的。

注意:

在确保服务器支持自定义请求方法之前,不要这样做。

CURLOPT_DEFAULT_PROTOCOL

如果 URL 缺少方案名称,则要使用的默认协议。

在 cURL 7.45.0 中添加。自 PHP 7.0.7 起可用。
CURLOPT_DNS_INTERFACE

设置 DNS 解析器应绑定到的网络接口的名称。这必须是接口名称(而不是地址)。

在 cURL 7.33.0 中添加。自 PHP 7.0.7 起可用。
CURLOPT_DNS_LOCAL_IP4

设置解析器应绑定到的本地 IPv4 地址。参数应包含一个作为字符串的单个数字 IPv4 地址。

在 cURL 7.33.0 中添加。自 PHP 7.0.7 起可用。
CURLOPT_DNS_LOCAL_IP6

设置解析器应绑定到的本地 IPv6 地址。参数应包含一个作为字符串的单个数字 IPv6 地址。

在 cURL 7.33.0 中添加。自 PHP 7.0.7 起可用。
CURLOPT_EGDSOCKET CURLOPT_RANDOM_FILE 相似,但它是一个指向熵收集守护进程套接字的文件名。
CURLOPT_ENCODING "Accept-Encoding: " 头的内容。这将启用对响应的解码。支持的编码包括 "identity""deflate""gzip"。如果设置为空字符串 "",则会发送包含所有支持编码类型的头。 在 cURL 7.10 中添加。
CURLOPT_FTPPORT 将用于获取用于 FTP “PORT” 指令的 IP 地址的值。“PORT” 指令告诉远程服务器连接到我们指定的 IP 地址。该字符串可以是普通 IP 地址、主机名、网络接口名称(在 Unix 下)或仅一个简单的 ‘-’ 以使用系统的默认 IP 地址。
CURLOPT_HSTS

HSTS(HTTP 严格传输安全)缓存文件名。

CURLOPT_HSTS_CTRL

控制 HSTS(HTTP 严格传输安全)行为。使用正确的功能集填充位掩码,以指示 cURL 如何处理使用此句柄进行传输的 HSTS。CURLHSTS_ENABLE 启用内存中的 HSTS 缓存。如果定义了 HSTS 缓存文件,请设置 CURLHSTS_READONLYFILE 以使文件只读。

CURLOPT_INTERFACE 要使用的出站网络接口的名称。这可以是接口名称、IP 地址或主机名。
CURLOPT_KEYPASSWD 使用 CURLOPT_SSLKEYCURLOPT_SSH_PRIVATE_KEYFILE 私钥所需的密码。 在 cURL 7.16.1 中添加。
CURLOPT_KRB4LEVEL KRB4(Kerberos 4)安全级别。以下任何值(从最低到最高)都是有效的:"clear""safe""confidential""private"。如果字符串与这些值都不匹配,则使用 "private"。将此选项设置为 null 将禁用 KRB4 安全性。目前,KRB4 安全性仅适用于 FTP 事务。
CURLOPT_LOGIN_OPTIONS 可用于设置协议特定的登录选项,例如通过 “AUTH=NTLM” 或 “AUTH=*” 的首选身份验证机制,应与 CURLOPT_USERNAME 选项一起使用。 在 cURL 7.34.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_PINNEDPUBLICKEY 设置固定公钥。字符串可以是固定公钥的文件名。预期文件格式为 “PEM” 或 “DER”。字符串也可以是任何数量的以 “sha256//” 开头并以 “;” 分隔的 Base64 编码的 sha256 哈希值。 在 cURL 7.39.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_POSTFIELDS 在 HTTP “POST” 操作中要发布的完整数据。此参数可以作为 URL 编码字符串传递,例如 'para1=val1&para2=val2&...',也可以作为数组传递,其中字段名称作为键,字段数据作为值。如果 value 是数组,则 Content-Type 标头将设置为 multipart/form-data 可以使用 CURLFileCURLStringFile 发送文件,在这种情况下,value 必须是数组。
CURLOPT_PRIVATE 与此 cURL 句柄关联的任何数据。此数据随后可以使用 curl_getinfo()CURLINFO_PRIVATE 选项检索。cURL 对此数据不做任何处理。当使用 cURL 多句柄时,此私有数据通常是一个唯一键,用于标识标准 cURL 句柄。 在 cURL 7.10.3 中添加。
CURLOPT_PRE_PROXY 设置一个 字符串,其中包含用作预代理的主机名或点分十进制 IP 地址,curl 在连接到 CURLOPT_PROXY 选项中指定的 HTTP(S) 代理之前连接到该预代理,以进行即将到来的请求。预代理只能是 SOCKS 代理,它应该以 [scheme]:// 为前缀以指定使用哪种 socks。IPv6 数值地址必须写在方括号中。将预代理设置为空字符串会显式禁用预代理的使用。要在该字符串中指定端口号,请将 :[port] 附加到主机名的末尾。代理的端口号可以选择使用单独的选项 CURLOPT_PROXYPORT 指定。如果未指定端口,则默认为使用端口 1080 进行代理。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY 用于通过隧道请求的 HTTP 代理。
CURLOPT_PROXY_SERVICE_NAME 代理身份验证服务名称。 在 cURL 7.43.0 中添加用于 HTTP 代理,在 cURL 7.49.0 中添加用于 SOCKS5 代理。从 PHP 7.0.7 开始可用。
CURLOPT_PROXY_CAINFO 代理证书颁发机构 (CA) 捆绑包的路径。将路径设置为 字符串,该字符串命名包含一个或多个证书的文件,以验证 HTTPS 代理。此选项用于连接到 HTTPS 代理,而不是 HTTPS 服务器。默认设置为 libcurl 的 cacert 捆绑包假定存储在系统路径。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_CAINFO_BLOB 包含一个或多个证书的 PEM 文件的名称,用于验证 HTTPS 代理。此选项用于连接到 HTTPS 代理,而不是 HTTPS 服务器。默认设置为 libcurl 的 cacert 捆绑包假定存储在系统路径。 从 PHP 8.2.0 和 libcurl >= cURL 7.77.0 开始可用。
CURLOPT_PROXY_CAPATH 包含多个 CA 证书的目录,用于验证 HTTPS 代理。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_CRLFILE 设置使用 PEM 格式的 CRL(证书吊销列表)的连接的名称,该列表用于在 SSL 交换期间发生的证书验证中使用。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_KEYPASSWD 设置字符串,用作使用 CURLOPT_PROXY_SSLKEY 私钥所需的密码。您以前不需要密码来加载证书,但需要密码来加载私钥。此选项用于连接到 HTTPS 代理,而不是 HTTPS 服务器。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_PINNEDPUBLICKEY 设置 HTTPS 代理的固定公钥。字符串可以是固定公钥的文件名。预期文件格式为 “PEM” 或 “DER”。字符串也可以是任何数量的以 “sha256//” 开头并以 “;” 分隔的 Base64 编码的 sha256 哈希值。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_SSLCERT 用于连接到 HTTPS 代理的客户端证书的文件名。默认格式在 Secure Transport 上为 “P12”,在其他引擎上为 “PEM”,可以使用 CURLOPT_PROXY_SSLCERTTYPE 更改。使用 NSS 或 Secure Transport 时,这也可以是您希望用于身份验证的证书的昵称,如安全数据库中所命名。如果要使用当前目录中的文件,请在前面加上 “./” 前缀,以避免与昵称混淆。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_SSLCERTTYPE 连接到 HTTPS 代理时使用的客户端证书的格式。支持的格式为 “PEM” 和 “DER”,但 Secure Transport 除外。OpenSSL(版本 0.9.3 及更高版本)和 Secure Transport(在 iOS 5 或更高版本,或 OS X 10.7 或更高版本上)也支持 “P12” 用于 PKCS#12 编码的文件。默认设置为 “PEM”。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_SSL_CIPHER_LIST 用于连接到 HTTPS 代理的密码列表。该列表必须语法正确,它包含一个或多个以冒号分隔的密码字符串。逗号或空格也可以用作分隔符,但通常使用冒号,!、- 和 + 可用作运算符。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_TLS13_CIPHERS 用于与代理建立 TLS 1.3 连接的密码套件列表。该列表必须语法正确,它包含一个或多个以冒号分隔的密码套件字符串。此选项目前仅在构建 curl 以使用 OpenSSL 1.1.1 或更高版本时使用。如果您使用的是其他 SSL 后端,可以尝试使用 CURLOPT_PROXY_SSL_CIPHER_LIST 选项设置 TLS 1.3 密码套件。 从 PHP 7.3.0 和 libcurl >= cURL 7.61.0 开始可用。在使用 OpenSSL >= 1.1.1 构建时可用。
CURLOPT_PROXY_SSLKEY 用于连接到 HTTPS 代理的私钥的文件名。默认格式为 “PEM”,可以使用 CURLOPT_PROXY_SSLKEYTYPE 更改。(仅限 iOS 和 Mac OS X)如果 curl 是针对 Secure Transport 构建的,则忽略此选项。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。如果构建了 TLS,则可用。
CURLOPT_PROXY_SSLKEYTYPE 私钥的格式。支持的格式为 “PEM”、“DER” 和 “ENG”。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_TLSAUTH_PASSWORD 用于使用 CURLOPT_PROXY_TLSAUTH_TYPE 选项指定的 TLS 身份验证方法的密码。要求还设置 CURLOPT_PROXY_TLSAUTH_USERNAME 选项。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_TLSAUTH_TYPE 用于 HTTPS 连接的 TLS 身份验证方法。支持的方法是 "SRP"

注意:

TLS 的安全远程密码 (SRP) 身份验证如果双方共享秘密,则提供相互身份验证。要使用 TLS-SRP,您还必须设置 CURLOPT_PROXY_TLSAUTH_USERNAMECURLOPT_PROXY_TLSAUTH_PASSWORD 选项。

从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXY_TLSAUTH_USERNAME 用于使用 CURLOPT_PROXY_TLSAUTH_TYPE 选项指定的 HTTPS 代理 TLS 身份验证方法的用户名。要求还设置 CURLOPT_PROXY_TLSAUTH_PASSWORD 选项。 从 PHP 7.3.0 和 libcurl >= cURL 7.52.0 开始可用。
CURLOPT_PROXYUSERPWD 格式为 "[username]:[password]" 的用户名和密码,用于连接到代理。
CURLOPT_RANDOM_FILE 用于为 SSL 种子随机数生成器的文件名。
CURLOPT_RANGE 要检索的数据范围,格式为 "X-Y",其中 X 或 Y 可选。HTTP 传输还支持多个间隔,以逗号分隔,格式为 "X-Y,N-M"
CURLOPT_REFERER 要在 HTTP 请求中使用的 "Referer: " 标头的内容。
CURLOPT_SASL_AUTHZID 传输的授权标识 (authzid)。仅适用于 PLAIN SASL 身份验证机制,其中它是可选的。如果未指定,则仅会将由用户名指定的身份验证标识 (authcid) 以及密码发送到服务器。服务器将在未提供时从 authcid 推导出 authzid,然后在内部使用它。
CURLOPT_SERVICE_NAME 身份验证服务名称。 在 cURL 7.43.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 包含 32 个十六进制数字的字符串。该字符串应该是远程主机公钥的 MD5 校验和,libcurl 将拒绝连接到主机,除非 md5sums 匹配。此选项仅适用于 SCP 和 SFTP 传输。 在 cURL 7.17.1 中添加。
CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 远程主机公钥的 Base64 编码 SHA256 哈希。如果给定的哈希与远程主机提供的哈希不匹配,则传输将失败。
CURLOPT_SSH_PUBLIC_KEYFILE 公钥的文件名。如果未使用,libcurl 默认使用 $HOME/.ssh/id_dsa.pub(如果设置了 HOME 环境变量),如果未设置 HOME,则在当前目录中使用 “id_dsa.pub”。 在 cURL 7.16.1 中添加。
CURLOPT_SSH_PRIVATE_KEYFILE 私钥的文件名。如果未使用,libcurl 默认使用 $HOME/.ssh/id_dsa(如果设置了 HOME 环境变量),如果未设置 HOME,则在当前目录中使用 “id_dsa”。如果该文件受密码保护,请使用 CURLOPT_KEYPASSWD 设置密码。 在 cURL 7.16.1 中添加。
CURLOPT_SSL_CIPHER_LIST 用于 SSL 的密码列表。例如,RC4-SHATLSv1 是有效的密码列表。
CURLOPT_SSL_EC_CURVES 以冒号分隔的椭圆曲线算法列表。例如,X25519:P-521 是两个椭圆曲线的有效列表。此选项定义了 SSL 握手中的客户端密钥交换算法,如果构建的 SSL 后端 cURL 支持它。
CURLOPT_SSLCERT 包含 PEM 格式证书的文件名。
CURLOPT_SSLCERTPASSWD 使用 CURLOPT_SSLCERT 证书所需的密码。
CURLOPT_SSLCERTTYPE 证书的格式。支持的格式为 "PEM"(默认)、"DER""ENG"。从 OpenSSL 0.9.3 开始,还支持 "P12"(用于 PKCS#12 编码的文件)。 在 cURL 7.9.3 中添加。
CURLOPT_SSLENGINE CURLOPT_SSLKEY 中指定的私有 SSL 密钥的加密引擎的标识符。
CURLOPT_SSLENGINE_DEFAULT 用于非对称加密操作的加密引擎的标识符。
CURLOPT_SSLKEY 包含私有 SSL 密钥的文件名。
CURLOPT_SSLKEYPASSWD

使用在 CURLOPT_SSLKEY 中指定的私有 SSL 密钥所需的秘密密码。

注意:

由于此选项包含敏感密码,请记住将包含它的 PHP 脚本保存在安全的地方。

CURLOPT_SSLKEYTYPE 在 **CURLOPT_SSLKEY** 中指定的私有 SSL 密钥的密钥类型。支持的密钥类型有 "PEM"(默认)、"DER""ENG"
CURLOPT_TLS13_CIPHERS 用于 TLS 1.3 连接的密码套件列表。列表必须语法正确,它包含一个或多个由冒号分隔的密码套件字符串。此选项目前仅在 curl 构建为使用 OpenSSL 1.1.1 或更高版本时使用。如果您使用的是其他 SSL 后端,您可以尝试使用 **CURLOPT_SSL_CIPHER_LIST** 选项设置 TLS 1.3 密码套件。 从 PHP 7.3.0 和 libcurl >= cURL 7.61.0 开始可用。在使用 OpenSSL >= 1.1.1 构建时可用。
CURLOPT_UNIX_SOCKET_PATH 启用使用 Unix 域套接字作为连接端点,并设置给定 字符串 的路径。 在 cURL 7.40.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_URL 要获取的 URL。这也可以在使用 curl_init() 初始化会话时设置。
CURLOPT_USERAGENT 要在 HTTP 请求中使用的 "User-Agent: " 标头的内容。
CURLOPT_USERNAME 用于身份验证的用户名。 在 cURL 7.19.1 中添加。
CURLOPT_PASSWORD 用于身份验证的密码。 在 cURL 7.19.1 中添加。
CURLOPT_USERPWD "[用户名]:[密码]" 格式的用户名和密码,用于连接。
CURLOPT_XOAUTH2_BEARER 指定 OAuth 2.0 访问令牌。 在 cURL 7.33.0 中添加。自 PHP 7.0.7 起可用。

value 对于以下 option 参数的值应为数组

选项 value 设置为 说明
CURLOPT_CONNECT_TO 连接到特定主机和端口,而不是 URL 的主机和端口。接受格式为 HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT 的字符串数组。 在 cURL 7.49.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_HTTP200ALIASES 将被视为有效响应而不是错误的 HTTP 200 响应数组。 在 cURL 7.10.3 中添加。
CURLOPT_HTTPHEADER 要设置的 HTTP 标头字段数组,格式为 array('Content-type: text/plain', 'Content-length: 100')
CURLOPT_POSTQUOTE 在执行 FTP 请求后在服务器上执行的 FTP 命令数组。
CURLOPT_PROXYHEADER 要传递给代理的自定义 HTTP 标头数组。 在 cURL 7.37.0 中添加。从 PHP 7.0.7 开始可用。
CURLOPT_QUOTE 在执行 FTP 请求之前在服务器上执行的 FTP 命令数组。
CURLOPT_RESOLVE 为特定主机和端口对提供自定义地址。主机名、端口和 IP 地址字符串数组,每个元素之间用冒号分隔。格式如下: array("example.com:80:127.0.0.1") 在 cURL 7.21.3 中添加。

value 对于以下 option 参数的值应为流资源(例如,使用 fopen()

选项 value 设置为
CURLOPT_FILE 要写入传输的 文件。默认值为 **STDOUT**(浏览器窗口)。
CURLOPT_INFILE 上传时要从中读取传输的文件。
CURLOPT_STDERR 将错误输出到另一个位置,而不是 **STDERR**。
CURLOPT_WRITEHEADER 将传输的标头部分写入的文件。

value 对于以下 option 参数的值应为有效函数的名称或闭包

选项 value 设置为 说明
CURLOPT_HEADERFUNCTION 接受两个参数的回调函数。第一个是 cURL 资源,第二个是包含要写入的标头数据的字符串。标头数据必须由此回调函数写入。返回写入的字节数。  
CURLOPT_PASSWDFUNCTION 接受三个参数的回调函数。第一个是 cURL 资源,第二个是包含密码提示的字符串,第三个是最大密码长度。返回包含密码的字符串。 从 PHP 7.3.0 开始移除。
CURLOPT_PROGRESSFUNCTION

接受五个参数的回调函数。第一个是 cURL 资源,第二个是本次传输预计要下载的总字节数,第三个是到目前为止下载的字节数,第四个是本次传输预计要上传的总字节数,第五个是到目前为止上传的字节数。

注意:

仅当 **CURLOPT_NOPROGRESS** 选项设置为 **false** 时才会调用该回调函数。

返回一个非零值以中止传输。在这种情况下,传输将设置一个 **CURLE_ABORTED_BY_CALLBACK** 错误。

 
CURLOPT_READFUNCTION 接受三个参数的回调函数。第一个是 cURL 资源,第二个是通过选项 **CURLOPT_INFILE** 提供给 cURL 的流资源,第三个是要读取的最大数据量。回调函数必须返回一个字符串,其长度等于或小于请求的数据量,通常是通过从传递的流资源中读取数据来实现的。它应该返回一个空字符串以表示 EOF  
CURLOPT_WRITEFUNCTION 接受两个参数的回调函数。第一个是 cURL 资源,第二个是包含要写入的数据的字符串。数据必须由此回调函数保存。它必须返回写入的确切字节数,否则传输将中止并出现错误。  
CURLOPT_XFERINFOFUNCTION 接受两个参数的回调函数。与 **CURLOPT_PROGRESSFUNCTION** 的目的类似,但它更现代,是 cURL 中的首选选项。 在 7.32.0 中添加。从 PHP 8.2.0 开始可用。

其他值

选项 value 设置为
CURLOPT_SHARE curl_share_init() 的结果。使 cURL 处理程序使用共享处理程序中的数据。

返回值

成功时返回 **true**,失败时返回 **false**。

变更日志

版本 描述
8.0.0 handle 现在需要 CurlHandle 实例;以前,需要的是 资源
7.3.15, 7.4.3 引入 **CURLOPT_HTTP09_ALLOWED**。
7.3.0 引入 **CURLOPT_ABSTRACT_UNIX_SOCKET**、**CURLOPT_KEEP_SENDING_ON_ERROR**、**CURLOPT_PRE_PROXY**、**CURLOPT_PROXY_CAINFO**、**CURLOPT_PROXY_CAPATH**、**CURLOPT_PROXY_CRLFILE**、**CURLOPT_PROXY_KEYPASSWD**、**CURLOPT_PROXY_PINNEDPUBLICKEY**、**CURLOPT_PROXY_SSLCERT**、**CURLOPT_PROXY_SSLCERTTYPE**、**CURLOPT_PROXY_SSL_CIPHER_LIST**、**CURLOPT_PROXY_SSLKEY**、**CURLOPT_PROXY_SSLKEYTYPE**、**CURLOPT_PROXY_SSL_OPTIONS**、**CURLOPT_PROXY_SSL_VERIFYHOST**、**CURLOPT_PROXY_SSL_VERIFYPEER**、**CURLOPT_PROXY_SSLVERSION**、**CURLOPT_PROXY_TLSAUTH_PASSWORD**、**CURLOPT_PROXY_TLSAUTH_TYPE**、**CURLOPT_PROXY_TLSAUTH_USERNAME**、**CURLOPT_SOCKS5_AUTH**、**CURLOPT_SUPPRESS_CONNECT_HEADERS**、**CURLOPT_DISALLOW_USERNAME_IN_URL**、**CURLOPT_DNS_SHUFFLE_ADDRESSES**、**CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS**、**CURLOPT_HAPROXYPROTOCOL**、**CURLOPT_PROXY_TLS13_CIPHERS**、**CURLOPT_SSH_COMPRESSION**、**CURLOPT_TIMEVALUE_LARGE** 和 **CURLOPT_TLS13_CIPHERS**。
7.0.7 引入了 CURL_HTTP_VERSION_2CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGECURL_HTTP_VERSION_2TLSCURL_REDIR_POST_301CURL_REDIR_POST_302CURL_REDIR_POST_303CURL_REDIR_POST_ALLCURL_VERSION_KERBEROS5CURL_VERSION_PSLCURL_VERSION_UNIX_SOCKETSCURLAUTH_NEGOTIATECURLAUTH_NTLM_WBCURLFTP_CREATE_DIRCURLFTP_CREATE_DIR_NONECURLFTP_CREATE_DIR_RETRYCURLHEADER_SEPARATECURLHEADER_UNIFIEDCURLMOPT_CHUNK_LENGTH_PENALTY_SIZECURLMOPT_CONTENT_LENGTH_PENALTY_SIZECURLMOPT_MAX_HOST_CONNECTIONSCURLMOPT_MAX_PIPELINE_LENGTHCURLMOPT_MAX_TOTAL_CONNECTIONSCURLOPT_CONNECT_TOCURLOPT_DEFAULT_PROTOCOLCURLOPT_DNS_INTERFACECURLOPT_DNS_LOCAL_IP4CURLOPT_DNS_LOCAL_IP6CURLOPT_EXPECT_100_TIMEOUT_MSCURLOPT_HEADEROPTCURLOPT_LOGIN_OPTIONSCURLOPT_PATH_AS_ISCURLOPT_PINNEDPUBLICKEYCURLOPT_PIPEWAITCURLOPT_PROXY_SERVICE_NAMECURLOPT_PROXYHEADERCURLOPT_SASL_IRCURLOPT_SERVICE_NAMECURLOPT_SSL_ENABLE_ALPNCURLOPT_SSL_ENABLE_NPNCURLOPT_SSL_FALSESTARTCURLOPT_SSL_VERIFYSTATUSCURLOPT_STREAM_WEIGHTCURLOPT_TCP_FASTOPENCURLOPT_TFTP_NO_OPTIONSCURLOPT_UNIX_SOCKET_PATHCURLOPT_XOAUTH2_BEARERCURLPROTO_SMBCURLPROTO_SMBSCURLPROXY_HTTP_1_0CURLSSH_AUTH_AGENTCURLSSLOPT_NO_REVOKE

示例

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

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

// 设置 URL 和其他相关选项
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, false);

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

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

说明

注意:

传递一个数组到 CURLOPT_POSTFIELDS 会将数据编码为 multipart/form-data,而传递一个 URL 编码字符串会将数据编码为 application/x-www-form-urlencoded

参见

添加注释

用户贡献的注释 64 notes

rmckay at webaware dot com dot au
11 年前
请大家停止将 CURLOPT_SSL_VERIFYPEER 设置为 false 或 0。如果您的 PHP 安装没有最新的 CA 根证书捆绑包,请从 curl 网站下载一个并保存到您的服务器上

http://curl.haxx.se/docs/caextract.html

然后在您的 php.ini 文件中设置指向它的路径,例如在 Windows 上

curl.cainfo=c:\php\cacert.pem

关闭 CURLOPT_SSL_VERIFYPEER 会允许中间人 (MITM) 攻击,您不希望发生这种情况!
joey
8 年前
使用 cURL 和 PHP 的任何人都应该记住,并非所有 CURLOPT 和 CURLINFO 常量都已记录在案。我始终建议直接阅读 cURL 文档,因为它有时包含更完善的信息。cURL API 倾向于很糟糕,所以不要指望东西会出现在您通常逻辑上寻找它们的地方。

在使用 cookie 时,curl 尤其难以使用。所以我会讨论我在 PHP 5.6 和 curl 7.26 中发现的内容。

如果您想在内存中管理 cookie,而无需使用文件,包括读取、写入和清除自定义 cookie,请继续阅读。

首先,要启用与 cURL 句柄关联的仅内存 cookie,您应该使用

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

cURL 喜欢在选项中使用魔术字符串作为特殊命令。它没有提供在内存中启用 cookie 引擎的选项,而是使用魔术字符串来实现这一点。尽管此处文档含糊地提到了这一点,但大多数人像我一样不会阅读它,因为 COOKIEFILE 与我们的预期完全相反。

要获取 cURL 句柄的 cookie,您可以使用

curl_getinfo($curl, CURLINFO_COOKIELIST);

这将返回一个数组,其中包含每个 cookie 的字符串。它用制表符分隔,不幸的是,如果您想做任何超出复制 cookie 的操作,您将不得不自己解析它。

要清除 cURL 句柄的内存中 cookie,您可以使用

curl_setopt($curl, CURLOPT_COOKIELIST, "ALL");

这是一个魔术字符串。cURL 文档中还有其他魔术字符串。如果没有使用魔术字符串,此字段应该采用与 cookielist 常量中的 getinfo 相同的字符串格式的 cookie。这可以用来删除单个 cookie,尽管这不是最优雅的 API。

对于复制 cookie,我建议使用 curl_share_init。

您还可以像这样将 cookie 从一个句柄复制到另一个句柄

foreach(curl_getinfo($curl_a, CURLINFO_COOKIELIST) as $cookie_line)
curl_setopt($curl, CURLOPT_COOKIELIST, $cookie_line);

删除 cookie 的一种不优雅的方法是跳过您不想要的 cookie。

我只建议将 COOKIELIST 与魔术字符串一起使用,因为 cookie 格式不安全或不稳定。您至少可以将制表符注入到路径和名称中,因此无法可靠地解析它。如果您必须解析它,那么为了确保安全,我建议禁止内容中超过 6 个制表符,这可能不会对大多数人造成很大损失。

作为绝对的最小验证,我建议

/^([^\t]+\t){5}[^\t]+$/D

以下是格式

#define SEP "\t" /* 制表符分隔字段 */

char *my_cookie =
"example.com" /* 主机名 */
SEP "FALSE" /* 包含子域名 */
SEP "/" /* 路径 */
SEP "FALSE" /* 安全 */
SEP "0" /* 以纪元时间格式表示的过期时间。0 == 会话 */
SEP "foo" /* 名称 */
SEP "bar"; /* 值 */
Steve Kamerman
13 年前
如果您希望 cURL 在不到一秒的时间内超时,您可以使用 CURLOPT_TIMEOUT_MS,尽管在“类 Unix 系统”上存在一个错误/“功能”,导致 libcurl 在值为 < 1000 毫秒时立即超时,并出现错误“cURL 错误 (28):超时”。对此行为的解释是

“如果 libcurl 构建为使用标准系统名称解析器,则传输的那一部分将仍然使用全秒分辨率进行超时,最短允许超时时间为一秒。”

这对 PHP 开发人员意味着“您可以在没有测试的情况下使用此功能,因为您无法确定 libcurl 是否正在使用标准系统名称解析器(但您可以相当确定它正在使用)”

问题在于,在 (Li|U)nix 上,当 libcurl 使用标准名称解析器时,将在名称解析期间引发 SIGALRM,libcurl 将其视为超时警报。

解决办法是使用 CURLOPT_NOSIGNAL 禁用信号。以下是一个请求自身以造成 10 秒延迟的示例脚本,以便您可以测试超时

<?php
if (!isset($_GET['foo'])) {
// 客户端
$ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
$data = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);
curl_close($ch);

if (
$curl_errno > 0) {
echo
"cURL 错误 ($curl_errno): $curl_error\n";
} else {
echo
"接收到的数据: $data\n";
}
} else {
// 服务器
sleep(10);
echo
"完成.";
}
?>
qwertz182
3 年前
正如 "示例 #2 上传文件" 中所说,它在 PHP 5.5.0 及更高版本中已弃用,但没有告诉你如何正确地实现它。
这里有一个使用 CURLFile 类的简单示例

<?php
$request
= [
'firstName' => 'John',
'lastName' => 'Doe',
'file' => new CURLFile('example.txt', 'text/plain') // 或者使用 curl_file_create()
];

$curlOptions = [
CURLOPT_URL => 'http://example.com/upload.php',
CURLOPT_POST => true,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $request,
];

$ch = curl_init();
curl_setopt_array($ch, $curlOptions);

$response = curl_exec($ch);
?>

这就像使用 input[type=file] 字段发布 HTML 表单一样。
在 Windows 上的结果可能看起来像这样

<?php
// $_POST
Array
(
[
firstName] => John
[lastName] => Doe
)

// $_FILES
Array
(
[
file] => Array
(
[
name] => example.txt
[type] => text/plain
[tmp_name] => C:\wamp64\tmp\php3016.tmp
[error] => 0
[size] => 14
)

)
?>

由于请求是一个数组(而不是一个字符串),curl 将自动将数据编码为 "multipart/form-data"。
请注意,如果将无效的文件路径传递给 CURLFile,设置 CURLOPT_POSTFIELDS 选项将失败。
因此,如果你使用 curl_setopt_array 同时设置选项,根据手册,“如果选项无法成功设置,立即返回 FALSE,忽略选项数组中的任何后续选项。”
所以你应该确保文件存在,或者使用 curl_setopt() 设置 CURLOPT_POSTFIELDS,并检查它是否返回 false,并相应地采取行动。
Philippe dot Jausions at 11abacus dot com
18 年前
关于回调方法的澄清

- CURLOPT_HEADERFUNCTION 用于处理在 *响应中* 收到的标题行。
- CURLOPT_WRITEFUNCTION 用于处理从 *响应中* 收到的数据。
- CURLOPT_READFUNCTION 用于处理在 *请求中* 传递的数据。

回调 "字符串" 可以是任何可调用的函数,包括数组(&$obj, 'someMethodName') 格式。

-Philippe
JScott jscott401 at gmail dot com
14 年前
关于 curlopt_writefunction 的一些补充说明。我最初对此很头疼,因为它没有得到很好的文档记录。

当你编写一个回调函数并将其与 curlopt_writefunction 一起使用时,它将被调用 *多次*。你的函数 *必须* 在每次调用时返回写入它的数据量。它对此非常挑剔。以下是我代码中的一个片段,可以帮助你

<?php
curl_setopt
($this->curl_handle, CURLOPT_WRITEFUNCTION, array($this, "receiveResponse"));

// 稍后在类中我编写了我的 receiveResponse 方法

private function receiveResponse($curlHandle,$xmldata)
{
$this->responseString = $xmldata;
$this->responseXML .= $this->responseString;
$this->length = strlen($xmldata);
$this->size += $this->length;
return
$this->length;

}
?>

我现在是为一个类做的。如果你没有使用面向对象编程,那么你显然需要根据自己的情况修改它。

CURL 多次调用你的脚本,因为数据不会总是立即发送。我们谈论的是互联网,所以它被分成数据包。你需要获取你的数据并将它们全部连接起来,直到全部写入。我当时快要把头发都抓掉了,因为我从服务器得到了不完整的 XML 片段,而且长度是随机的。最后我终于弄明白了是怎么回事。希望这有帮助。
ashw1 - at - no spam - post - dot - cz
17 年前
如果你想知道为什么在 Windows 下 cookies 不起作用,我已经搜索了一些答案,以下是结果:在 WIN 下你需要输入 cookie 文件的绝对路径。

这段代码解决了这个问题

<?php

if ($cookies != '')
{
if (
substr(PHP_OS, 0, 3) == 'WIN')
{
$cookies = str_replace('\\','/', getcwd().'/'.$cookies);}
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies);
}

?>
cmatiasvillanueva at gmail dot com
6 年前
文档中没有提到的是,如果你想设置本地端口或本地端口范围来建立连接,可以通过添加 CURLOPT_LOCALPORT 和 CURLOPT_LOCALPORTRANGE 选项来实现。

例如
$conn=curl_init ('example.com');
curl_setopt($conn, CURLOPT_LOCALPORT, 35000);
curl_setopt($conn, CURLOPT_LOCALPORTRANGE, 200);

CURLOPT_LOCALPORT:这将设置用于连接的套接字的本地端口号。

CURLOPT_LOCALPORTRANGE:range 参数是 libcurl 尝试找到工作本地端口号的次数。它从给定的 CURLOPT_LOCALPORT 开始,并为每次重试增加 1。将此选项设置为 1 或更低将使 libcurl 仅对确切的端口号尝试一次。

接口也可以使用 CURLOPT_INTERFACE 配置

例如

curl_setopt($conn, CURLOPT_INTERFACE, "eth1");
sgamon at yahoo dot com
16 年前
如果你正在执行 POST,并且内容长度为 1025 或更大,那么 curl 会利用 http 1.1 的一个特性:100 (Continue) 状态。

参见 http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3

* 它会添加一个标题,“Expect: 100-continue”。
* 然后它发送请求头,等待 100 响应代码,然后发送内容

不过并非所有 Web 服务器都支持这一点。根据服务器的不同,会返回各种错误。如果发生这种情况,可以使用以下命令抑制 "Expect" 标题

<?php
curl_setopt
($ch, CURLOPT_HTTPHEADER, array('Expect:'));
?>

参见 http://www.gnegg.ch/2007/02/the-return-of-except-100-continue/
mw+php dot net at lw-systems dot de
12 年前
关于 CURLOPT_POSTFIELDS 选项用法的描述应该强调,使用 HTTP/1.1 的 POST 与 cURL 意味着使用 "Expect: 100-continue" 标题。某些 Web 服务器不理解 POST 数据的 chunked 传输处理。

要禁用此行为,必须禁用使用“Expect:”头,方法如下:

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:"));
Ed Cradock
14 年前
PUT 请求非常简单,只需确保指定 content-length 头并设置 post 字段为字符串即可。

示例

<?php
function doPut($url, $fields)
{
$fields = (is_array($fields)) ? http_build_query($fields) : $fields;

if(
$ch = curl_init($url))
{
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields)));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_exec($ch);

$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

return (int)
$status;
}
else
{
return
false;
}
}

if(
doPut('http://example.com/api/a/b/c', array('foo' => 'bar')) == 200)
// do something
else
// do something else.
?>

你可以在另一端使用以下方法获取请求数据:

<?php
if($_SERVER['REQUEST_METHOD'] == 'PUT')
{
parse_str(file_get_contents('php://input'), $requestData);

// Array ( [foo] => bar )
print_r($requestData);

// Do something with data...
}
?>

DELETE 可以用完全相同的方式完成。
Victor Jerlin
15 年前
看起来这个页面上没有提到一些选项,但在 http://curl.haxx.se/libcurl/c/curl_easy_setopt.html 上列出的选项实际上是受支持的。

我很高兴地发现,我实际上可以使用 CURLOPT_FTP_CREATE_MISSING_DIRS,即使是在 PHP 中。
dweingart at pobox dot com
21 年前
如果你想让 Curl 遵循重定向,并且还希望 Curl 回显设置过程中的任何 cookie,请使用以下方法:

<?php curl_setopt($ch, CURLOPT_COOKIEJAR, '-'); ?>

“-” 表示标准输出。

-dw
Chris at PureFormSolutions dot com
14 年前
我发现多次设置 CURLOPT_HTTPHEADER 会清除你之前使用 CURLOPT_HTTPHEADER 设置的任何头。

请考虑以下内容:
<?php
# ...

curl_setopt($cURL,CURLOPT_HTTPHEADER,array (
"Content-Type: text/xml; charset=utf-8",
"Expect: 100-continue"
));

# ... do some other stuff ...

curl_setopt($cURL,CURLOPT_HTTPHEADER,array (
"Accept: application/json"
));

# ...
?>

我设置的 Content-Type 和 Expect 都不会出现在传出的头中,但 Accept 会。
luca dot manzo at bbsitalia dot com
18 年前
如果你在 curl 中遇到 cookie 处理问题,

- curl 在单个 curl 会话中透明地管理 cookie。
- 选项
<?php curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName"); ?>

使 curl 在 curl 会话结束时将 cookie 存储到文件中。

- 选项
<?php curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName"); ?>

使 curl 使用给定的文件作为发送到服务器的 cookie 的来源。

因此,要正确处理不同 curl 会话之间的 cookie,你需要做一些类似以下的事情:

<?php
$ch
= curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE_PATH);
curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIE_FILE_PATH);

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);
return
$result;
?>

特别地,如果你使用 PEAR_SOAP 库来构建一个通过 https 的 webservice 客户端,并且远程服务器需要建立一个会话 cookie,那么这将是 **必要的**。实际上,每条 soap 消息都是使用不同的 curl 会话发送的!

我希望这能帮助到一些人。
Luca
yann dot corno at free dot fr
21 年前
关于 CURLOPT_HTTPHEADER 选项,我花了一些时间才弄清楚如何格式化所谓的“数组”。实际上,它是一个字符串列表。如果 Curl 已经定义了一个头项,你的头项将替换它。以下是一个在 POST 中更改 Content Type 的示例:

<?php curl_setopt ($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); ?>

Yann
joelhy
8 年前
请注意,CURLINFO_HEADER_OUT 和 CURLOPT_VERBOSE 选项不能一起使用。
“当 CURLINFO_HEADER_OUT 设置为 TRUE 时,CURLOPT_VERBOSE 就不起作用。”(来自 https://bugs.php.net/bug.php?id=65348)。
我花了一两个小时才弄明白这一点。
badman
10 年前
许多主机使用 PHP safe_mode 或/和 open_basedir,因此你无法使用 CURLOPT_FOLLOWLOCATION。如果你尝试,你会看到类似这样的消息:
在 [你脚本名称 & 路径] 的第 XXX 行,当 safe_mode 启用或 open_basedir 设置时,无法激活 CURLOPT_FOLLOWLOCATION。

首先,我尝试使用这个页面中的 zsalab 函数 (http://us2.php.net/manual/en/function.curl-setopt.php#102121),但由于某种原因,它无法正常工作。因此,我编写了自己的函数。

它可以用来代替 curl_exec。如果服务器 HTTP 响应代码为 30x,函数将转发请求,只要响应不与 30x 不同(例如,200 Ok)。你也可以使用 POST。

function curlExec(/* Array */$curlOptions='', /* Array */$curlHeaders='', /* Array */$postFields='')
{
$newUrl = '';
$maxRedirection = 10;
do
{
if ($maxRedirection<1) die('Error: reached the limit of redirections');

$ch = curl_init();
if (!empty($curlOptions)) curl_setopt_array($ch, $curlOptions);
if (!empty($curlHeaders)) curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);
if (!empty($postFields))
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
}

if (!empty($newUrl)) curl_setopt($ch, CURLOPT_URL, $newUrl); // redirect needed

$curlResult = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($code == 301 || $code == 302 || $code == 303 || $code == 307)
{
preg_match('/Location:(.*?)\n/', $curlResult, $matches);
$newUrl = trim(array_pop($matches));
curl_close($ch);

$maxRedirection--;
continue;
}
else // no more redirection
{
$code = 0;
curl_close($ch);
}
}
while($code);
return $curlResult;
}
jade dot skaggs at gmail dot com
16 年前
经过一番努力,我终于成功地发送了一个需要 HTTP 身份验证的 SOAP 请求。以下是一些代码,希望对其他人有所帮助。

<?php

$credentials
= "username:password";

// 读取要发送到 Web 服务的 XML 文件
$request_file = "./SampleRequest.xml";
$fh = fopen($request_file, 'r');
$xml_data = fread($fh, filesize($request_file));
fclose($fh);

$url = "http://www.example.com/services/calculation";
$page = "/services/calculation";
$headers = array(
"POST ".$page." HTTP/1.0",
"Content-type: text/xml;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction: \"run\"",
"Content-length: ".strlen($xml_data),
"Authorization: Basic " . base64_encode($credentials)
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);

// 将 XML 应用到 curl 调用中
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);

$data = curl_exec($ch);

if (
curl_errno($ch)) {
print
"Error: " . curl_error($ch);
} else {
// 显示结果
var_dump($data);
curl_close($ch);
}

?>
jancister at gmail dot com
9 年前
请注意,如果你想使用 CURLOPT_PROGRESSFUNCTION 选项处理进度,你需要考虑你使用的 PHP 版本。从 5.5.0 版本开始,在传递给回调函数的参数数量/顺序上引入了不兼容的更改,并且 cURL 资源现在作为第一个参数传递。

5.5.0 版本之前
<?php
// ...
curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_setopt($resource, CURLOPT_NOPROGRESS, false);
// ...
function progressCallback($download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
// 处理进度
}
?>

从 5.5.0 版本开始
<?php
// ...
curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_setopt($resource, CURLOPT_NOPROGRESS, false);
// ...
function progressCallback($resource, $download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
// 处理进度
}
?>

然而,如果你的代码需要与 5.5.0 版本之前和之后的 PHP 版本兼容,请考虑添加一个版本检查
<?php
// ...
curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_setopt($resource, CURLOPT_NOPROGRESS, false);
// ...
function progressCallback($resource, $download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
/**
* $resource 参数是在 5.5.0 版本中添加的,破坏了向后兼容性;
* 如果我们使用的是低于 5.5.0 的 PHP 版本,我们需要调整参数的顺序
* @see https://php.net/manual/en/function.curl-setopt.php#refsect1-function.curl-setopt-changelog
*/
if (version_compare(PHP_VERSION, '5.5.0') < 0) {
$uploaded = $upload_size;
$upload_size = $downloaded;
$downloaded = $download_size;
$download_size = $resource;
}

// 处理进度
}
?>
joeterranova at gmail dot com
14 年前
似乎在设置 CURLOPT_RETURNTRANSFER 之前设置 CURLOPT_FILE 不起作用,可能是因为 CURLOPT_FILE 依赖于 CURLOPT_RETURNTRANSFER 的设置。

所以应该这样做

<?php
curl_setopt
($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $fp);
?>

而不是这样

<?php
curl_setopt
($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
?>
skyogre __at__ yandex __dot__ ru
18 年前
在 PHP 4 及更高版本中,使用 curl 传输 $_POST 数据确实存在问题。
我改进了 Alejandro Moreno 编写的编码函数,使其能够正确处理多维数组。

<?php
function data_encode($data, $keyprefix = "", $keypostfix = "") {
assert( is_array($data) );
$vars=null;
foreach(
$data as $key=>$value) {
if(
is_array($value)) $vars .= data_encode($value, $keyprefix.$key.$keypostfix.urlencode("["), urlencode("]"));
else
$vars .= $keyprefix.$key.$keypostfix."=".urlencode($value)."&";
}
return
$vars;
}

curl_setopt($ch, CURLOPT_POSTFIELDS, substr(data_encode($_POST), 0, -1) );

?>
fnjordy at gmail dot com
15 年前
请注意,当 CURLOPT_RETURNTRANSFER 与 CURLOPT_WRITEFUNCTION 一起使用时,实际上有三种设置:默认、true 和 false。

默认 - 回调函数将按预期调用。
true - 内容将被返回,但回调函数将不会被调用。
false - 内容将被输出,但回调函数将不会被调用。

请注意,CURLOPT_HEADERFUNCTION 回调函数始终会被调用。
juozaspo at gmail dot com
11 年前
我创建了一个示例,它获取传递给脚本的 URL 上的文件并将其输出到浏览器。

<?php
// 获取文件(例如图像)并将其输出到浏览器
$ch = curl_init(); // 打开 curl 句柄
curl_setopt($ch, CURLOPT_URL, $_GET['url']); // 设置 URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 不直接输出,使用变量
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // 执行二进制传输
curl_setopt($ch, CURLOPT_FAILONERROR, 1); // 遇到错误时停止
$file=curl_exec($ch); // 将内容存储在变量中
if(!curl_errno($ch))
{
// 发送标题并输出
header ("Content-type: ".curl_getinfo($ch, CURLINFO_CONTENT_TYPE)."");
header ("Content-Length: ".curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD)."");
echo
$file;
} else echo
'Curl error: ' . curl_error($ch);
curl_close($ch); // 关闭 curl 句柄
?>

p.s. 确保代码前后没有换行符,否则脚本可能无法正常工作。
Joey Hewitt
12 年前
请注意,如果将证书链放入 PEM 文件中,则需要对证书进行排序,以便每个证书后跟其颁发者(即,根证书最后)。

来源:http://publib.boulder.ibm.com/tividd/td/ITIM/SC32-1493-00/en_US/HTML/im451_config09.htm
anderseta at gmail dot com
14 年前
如果您想查找正在流式传输的文件的大小并将其用作标题,请按照以下步骤操作

<?php

function write_function($curl_resource, $string)
{
if(
curl_getinfo($curl_resource, CURLINFO_SIZE_DOWNLOAD) <= 2000)
{
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Description: File Transfer');
header("Content-Transfer-Encoding: binary");
header("Content-Type: ".curl_getinfo($curl_resource, CURLINFO_CONTENT_TYPE)."");
header("Content-Length: ".curl_getinfo($curl_resource, CURLINFO_CONTENT_LENGTH_DOWNLOAD)."");
}

print
$string;

return
mb_strlen($string, '8bit');
}

?>

1440 是 curl 调用 write 函数的默认字节数(BUFFERSIZE 不会影响此值,实际上我认为您无法更改此值),这意味着标题只会设置一次。

write_function 必须返回字符串的精确字节数,因此您可以使用 mb_strlen 返回一个值。
PHP at RHaworth dot net
13 年前
当 CURLOPT_FOLLOWLOCATION 和 CURLOPT_HEADER 都为真并且发生了重定向时,curl_exec() 返回的标题将包含重定向链中的所有标题,顺序为它们遇到的顺序。
Dustin Hawkins
18 年前
为了进一步扩展 CURLOPT_CAPATH 和 CURLOPT_CAINFO 的使用...

在我的情况下,我想阻止 curl 与除我自己的服务器之外的任何 HTTPS 服务器通信,使用自签名证书。为此,您需要安装 openssl 并访问 HTTPS 服务器证书(在 apache 上默认为 server.crt)。

然后,您可以使用类似于此的命令将您的 apache 证书转换为 curl 喜欢的证书。

$ openssl x509 -in server.crt -out outcert.pem -text

然后将 CURLOPT_CAINFO 设置为 outcert.pem 的完整路径,并打开 CURLOPT_SSL_VERIFYPEER。

如果您想使用 CURLOPT_CAPATH 选项,您应该为所有已创建的有效证书创建一个目录,然后使用 openssl 中包含的 c_rehash 脚本来“准备”该目录。

如果您不使用 c_rehash 实用程序,curl 将忽略您设置的目录中的任何文件。
saidk at phirebranding dot com
15 年前
将 PHP 的 $_SESSION 传入您的 cURL 调用中

<?php
session_start
();
$strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
session_write_close();

$curl_handle = curl_init('enter_external_url_here');
curl_setopt( $curl_handle, CURLOPT_COOKIE, $strCookie );
curl_exec($curl_handle);
curl_close($curl_handle);
?>

这对我来说非常有效。我正在从同一服务器调用页面,并且需要保留 $_SESSION 变量。这将它们传递过去。如果您想测试,只需 print_r($_SESSION);

享受吧!
Martin K.
10 年前
如果您只想启用 cookie 处理,并且不需要为单独的会话保存 cookie,只需将 CURLOPT_COOKIEFILE 设置为空字符串即可。我被建议使用 php://memory,但这似乎没有相同的效果。

虽然这在文档中说明了,但我认为有必要重申,因为它给我带来了很多麻烦。
Ojas Ojasvi
16 年前
<?php
/*
* 作者: Ojas Ojasvi
* 发布日期: 2007年9月25日
* 描述: 此代码展示了 disguise_curl() 函数的示例,该函数使用伪造的用户代理和伪造的头部信息从网站抓取内容,同时保持完全伪装。
*/

$url = 'https://php.net';

// 使用伪造的头部信息和伪造的用户代理伪装 curl。
function disguise_curl($url)
{
$curl = curl_init();

// 设置头部信息 - 我使用了 Firefox 版本 2.0.0.6 中的相同头部信息
// 由于 php.net 限制了行长度,所以以下代码被分隔了。 :/
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: "; // 浏览器将此保留为空白。

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);

$html = curl_exec($curl); // 执行 curl 命令
curl_close($curl); // 关闭连接

return $html; // 最后,返回 $html
}

// 使用该函数并显示网站上的文本
$text = disguise_curl($url);
echo
$text;
?>

Ojas Ojasvi
Aaron Wells
9 年前
如果您使用 cURL 获取用户提供的 URL(例如,在基于 Web 的 RSS 聚合器中),请注意服务器端请求伪造 (SSRF) 的风险。这是一种攻击,用户利用 cURL 请求是从 Web 服务器本身发出的这一事实,从而访问他们无法从网络外部访问的网络位置。

例如,他们可以输入 "http://localhost" URL,并通过 "localhost" 访问 Web 服务器上的内容。或者,"ftp://localhost"。cURL 支持许多协议!

如果您使用 CURLOPT_FOLLOWLOCATION,恶意 URL 可能会出现在原始请求的重定向中。cURL 还会遵循重定向头部信息到其他协议!(303 See Other; Location: ftp://localhost)。

因此,如果您在使用 cURL 处理用户提供的 URL 时,至少使用 CURLOPT_PROTOCOLS(这也设置 CURLOPT_REDIR_PROTOCOLS),并禁用 CURLOPT_FOLLOWLOCATION 或使用 "SafeCurl" 库安全地遵循重定向。
mr at coder dot tv
18 年前
有时您无法使用 CURLOPT_COOKIEJAR 和 CURLOPT_COOKIEFILE,因为服务器 php 设置限制(他们说您可能会使用这些选项从服务器获取任何文件)。以下是一个解决方案
1)不要使用 CURLOPT_FOLLOWLOCATION
2)使用 curl_setopt($ch, CURLOPT_HEADER, 1)
3)从头部信息中获取 cookie,如下所示
preg_match_all('|Set-Cookie: (.*);|U', $content, $results);
$cookies = implode(';', $results[1]);
4)使用 curl_setopt($ch, CURLOPT_COOKIE, $cookies); 设置它们。

祝您好运,Yevgen
eric dot van dot eldik at peercode dot nl
5 年前
当您使用 PUT 请求时出现此错误:“SSL read: error:00000000:lib(0):func(0):reason(0), errno 104”

这可能是由以下原因造成的
<?php
curl_setopt
($ch, CURLOPT_PUT, TRUE);
?>

请尝试以下方法
<?php
curl_setopt
($ch, CURLOPT_CUSTOMREQUEST, "PUT");
?>
S\
13 年前
当使用 CURLOPT_POSTFIELDS 将数组作为参数时,您需要高度重视用户输入。未经验证的用户输入会导致严重的安全问题。

<?php

/**
* test.php:
*/
$ch = curl_init('http://example.com');

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'foo' => $_GET['bar']
));

curl_exec($ch);

?>

请求 "test.php?bar=@/home/user/test.png" 将会发送 "test.png" 到 example.com。
确保您从用户输入中删除了前导 "@"。
clint at fewbar dot com
14 年前
如果您在 curl 处理程序上启用了条件获取,然后在后续请求中,您没有为 CURLOPT_TIMEVALUE 设置好的值,可以使用以下方法禁用 If-Modified-Since 检查

<?php

$ch
= curl_init();
curl_setopt($ch, CURLOPT_URL, $foo);
curl_setopt($ch, CURLOPT_TIMEVALUE, filemtime($foo_path));
curl_setopt($ch, CURLOPT_TIMECONDITION, CURLOPT_TIMECOND_IFMODIFIEDSINCE);
curl_exec($ch);
// 重用同一个 curl 处理程序
curl_setopt($ch, CURLOPT_URL, $bar);
curl_setopt($ch, CURLOPT_TIMEVALUE, null); // 不知道修改时间
curl_setopt($ch, CURLOPT_TIMECONDITION, 0); // 设置为 0,将其关闭
curl_exec($ch);

?>
ohcc at 163 dot com
6 年前
以下是如何使用 PHP 中的 cURL 将现有文件上传到 FTP 服务器。

您应该记住,CURLOPT_URL 应该包含要在 FTP 服务器上保存的文件的基名。例如,如果您将 hello.txt 上传到 ftp://www.wuxiancheng.cn/text/,,CURLOPT_URL 应该是 ftp://www.wuxiancheng.cn/text/hello.txt 而不是 ftp://www.wuxiancheng.cn/text/,,否则在调用 curl_error(); 时,您将收到类似 "Uploading to a URL without a file name!" 的错误消息。

<?php
$ch
= curl_init();
$filepath = 'D:\Web\www\wuxiancheng.cn\hello.txt';
$basename = pathInfo($filepath, PATHINFO_BASENAME);
$filesize = fileSize($filepath);
curl_setopt_array(
$ch,
array(
CURLOPT_URL => 'ftp://www.wuxiancheng.cn/text/' . $basename,
CURLOPT_USERPWD => 'USERNAME:PASSWORD',
CURLOPT_PROTOCOLS => CURLPROTO_FTP,
CURLOPT_UPLOAD => true,
CURLOPT_INFILE => $filepath,
CURLOPT_INFILESIZE => $filesize,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
)
);
curl_exec($ch);
$message = curl_errno($ch) === CURLE_OK ? 'success' : 'failure';
echo
$message;
?>
Pawel Antczak
14 年前
您好。
在遇到“CURLOPT_FOLLOWLOCATION 在安全模式或 open_basedir 设置的情况下无法激活”的问题时
我一直在寻找解决方案。
我在这个页面上找到了几种方法,但没有一个足够好,所以我做了一个。
<?php
function curl_redirect_exec($ch, &$redirects, $curlopt_header = false) {
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (
$http_code == 301 || $http_code == 302) {
list(
$header) = explode("\r\n\r\n", $data, 2);
$matches = array();
preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
$url = trim(array_pop($matches));
$url_parsed = parse_url($url);
if (isset(
$url_parsed)) {
curl_setopt($ch, CURLOPT_URL, $url);
$redirects++;
return
curl_redirect_exec($ch, $redirects);
}
}
if (
$curlopt_header)
return
$data;
else {
list(,
$body) = explode("\r\n\r\n", $data, 2);
return
$body;
}
}
?>

现有函数的主要问题是缺乏信息,不知道进行了多少次重定向。
这个函数会计算它。
第一个参数和往常一样。
第二个参数应该是一个已初始化的整数,它将根据重定向次数递增。
如果需要,可以设置 CURLOPT_HEADER。
regan dot corey at gmail dot com
11 年前
我花了两天时间试图将一个包含文件上传的多维表单数组 POST 到远程服务器以更新产品。以下是我最终使脚本按预期运行的突破。

首先,HTML 表单使用以下输入名称
<input type="text" name="product[name]" />
<input type="text" name="product[cost]" />
<input type="file" name="product[thumbnail]" />
以及另外两个不属于 product 数组的表单输入
<input type="text" name="method" value="put" />
<input type="text" name="mode" />

我使用了几个 cURL 选项,但只有两个(除了 URL)是重要的
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $postfields);
到目前为止,这很标准。
注意:不需要设置标头,当您将数组传递给 CURLOPT_POSTFIELDS 时,cURL 会自动设置标头(例如 content-type: multipart/form-data; content-length...)。
注意:即使这应该通过 HTTP POST 表单执行 PUT 命令,也不需要通过 cURL 本地传递任何特殊的 PUT 选项。选项如
curl_setopt($handle, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT', 'Content-Length: ' . strlen($fields)));

curl_setopt($handle, CURLOPT_PUT, true);

curl_setopt($handle, CURLOPT_CUSTOMREQUEST, "PUT);
不需要使代码正常工作。

我想通过 cURL 传递的字段被排列成一个类似这样的数组
$postfields = array("method" => $_POST["method"],
"mode" => $_POST["mode"],
"product" => array("name" => $_POST["product"],
"cost" => $_POST["product"]["cost"],
"thumbnail" => "@{$_FILES["thumbnail"]["tmp_name"]};type={$_FILES["thumbnail"]["type"]}")
);

- 注意 @ 如何位于临时文件名之前,这创建了一个链接,因此 PHP 将上传/传输实际文件,而不仅仅是文件名,如果没有包含 @,则会发生这种情况。
- 注意我如何强制设置要上传文件的 MIME 类型。我遇到了一些问题,其中图像文件类型默认为 octet-stream 而不是 image/png 或 image/jpeg 或所选图像的任何类型。

然后我尝试直接将 $postfields 传递到 curl_setopt($this->handle, CURLOPT_POSTFIELDS, $postfields); 但它不起作用。
我尝试使用 http_build_query($postfields); 但它也没有正常工作。
在这两种情况下,文件要么不会被视为实际文件,要么表单数据没有被正确发送。问题是 HTTP 传输数组的方法。虽然 PHP 和其他语言可以弄清楚如何处理通过表单传递的数组,但 HTTP 并没有那么复杂。我不得不像这样重写 $postfields 数组
$postfields = array("method" => $_POST["method"],
"mode" => $_POST["mode"],
"product[name]" => $_POST["product"],
"product[cost]" => $_POST["product"]["cost"],
"product[thumbnail]" => "@{$_FILES["thumbnail"]["tmp_name"]}");
curl_setopt($handle, CURLOPT_POSTFIELDS, $postfields);

这样,在不使用 http_build_query 的情况下,解决了我的所有问题。现在接收主机正确地输出 $_POST 和 $_FILES 变量。
zsalab
13 年前
如果启用了 safe_mode 或 open_basedir,则使用 curl 处理重定向。该函数工作透明,没有标头和 returntransfer 选项的问题。您可以使用可选的第二个参数来处理最大重定向(如果超过最大重定向,该函数会将变量设置为零)。
第二个参数值
- maxredirect 为空或未设置:最多重定向五次,之后会引发 PHP 警告
- maxredirect 大于零:不会引发错误,但参数变量被设置为零
- maxredirect 小于或等于零:不进行重定向

<?php
function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
$mr = $maxredirect === null ? 5 : intval($maxredirect);
if (
ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
} else {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
if (
$mr > 0) {
$newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

$rch = curl_copy_handle($ch);
curl_setopt($rch, CURLOPT_HEADER, true);
curl_setopt($rch, CURLOPT_NOBODY, true);
curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
do {
curl_setopt($rch, CURLOPT_URL, $newurl);
$header = curl_exec($rch);
if (
curl_errno($rch)) {
$code = 0;
} else {
$code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
if (
$code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newurl = trim(array_pop($matches));
} else {
$code = 0;
}
}
} while (
$code && --$mr);
curl_close($rch);
if (!
$mr) {
if (
$maxredirect === null) {
trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
} else {
$maxredirect = 0;
}
return
false;
}
curl_setopt($ch, CURLOPT_URL, $newurl);
}
}
return
curl_exec($ch);
}
?>
Adam Monsen
12 年前
如果您想将 Content-Type 标头设置为“multipart/form-data”(例如,当 CURLOPT_POSTFIELDS 是一个数组时),则必须取消设置 CURLOPT_POST。如果您将 CURLOPT_POSTFIELDS 设置为数组并将 CURLOPT_POST 设置为 TRUE,则 Content-Length 将为 -1,并且大多数正常服务器将拒绝请求。如果您将 CURLOPT_POSTFIELDS 设置为数组并将 CURLOPT_POST 设置为 FALSE,则 cURL 将发送 GET 请求。
c00lways at gmail dot com
16 年前
如果您想向服务器发送 xml 请求(例如,创建 soap 代理),
您必须设置

<?php
curl_setopt
($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
?>

确保您注意缓存问题
以下代码将阻止缓存...

<?php
curl_setopt
($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
?>

希望它有帮助;)
fred at themancan dot com
16 年前
要找到给定 HTTP POST 请求使用的编码很容易 - 将数组传递给 CURLOPT_POSTFIELDS 会导致 multipart/form-data

<?php
curl_setopt
(CURLOPT_POSTFIELDS, array('field1' => 'value'));
?>

传递 URL 编码的字符串将导致 application/x-www-form-urlencoded

<?php
curl_setopt
(CURLOPT_POSTFIELDS, array('field1=value&field2=value2'));
?>

我在与仓库系统和电子邮件系统集成时遇到了这种情况;两者都不接受 multipart/form-data,但都欣然接受 application/x-www-form-urlencoded。
scy-phpmanual at scytale dot name
13 年前
为了重置 CURLOPT_HTTPHEADER,将其设置为 array()。cURL C API 表示您应该将其设置为 NULL,但这在 PHP 包装器中不起作用。
rob
14 年前
文档中没有提到的是,您必须将 CURLOPT_COOKIEJAR 设置为一个文件,以便 CURL 句柄实际使用 cookie,如果未设置,则不会解析 cookie。
markandrewslade at gmail dot com
7 年前
与文档相反,CURLOPT_STDERR 应设置为要写入的文件的句柄,而不是文件的路径。
ron at ttvavanti dot nl
20 年前
如果您指定 CAINFO,请注意该文件必须以 PEM 格式! (如果不是,它将无法正常工作)。
使用 Openssl,您可以使用
openssl x509 -in <cert> -inform d -outform PEM -out cert.pem
从二进制证书(您在某个地方下载 ca 时获得的证书)创建 pem 格式的证书。
eion at bigfoot dot com
17 年前
如果您尝试使用 CURLOPT_FOLLOWLOCATION 并收到此警告
警告:curl_setopt() [function.curl-setopt]:在安全模式或设置了 open_basedir 时无法激活 CURLOPT_FOLLOWLOCATION...

那么您将需要阅读 https://php.net/ChangeLog-4.php,它表示“从 PHP 4.4.4/5.1.5 开始,在启用 open_basedir 或安全模式时禁用 curl 中的 CURLOPT_FOLLOWLOCATION”。这是因为 curl 不是 PHP 的一部分,它不知道 open_basedir 或安全模式的值,因此您可以通过重定向(使用 header('Location: ...'))到“file://”URL 来破坏以安全模式运行的 Web 服务器,curl 很乐意检索这些 URL。

在 PHP 或 curl 中更改 curl 扩展名(如果曾经这样做)以处理“Location:”标头之前,这里是我正在使用的 curl_exec 函数的远非完美重制版本。

由于没有 curl_getopt 函数等效项,您将不得不调整该函数以使其适合您的特定用途。就目前而言,它返回响应主体,而不是标头。它也不处理包含用户名和密码的重定向 URL。

<?php
function curl_redir_exec($ch)
{
static
$curl_loops = 0;
static
$curl_max_loops = 20;
if (
$curl_loops++ >= $curl_max_loops)
{
$curl_loops = 0;
return
FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
list(
$header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (
$http_code == 301 || $http_code == 302)
{
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!
$url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return
$data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!
$url['scheme'])
$url['scheme'] = $last_url['scheme'];
if (!
$url['host'])
$url['host'] = $last_url['host'];
if (!
$url['path'])
$url['path'] = $last_url['path'];
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
debug('Redirecting to', $new_url);
return
curl_redir_exec($ch);
} else {
$curl_loops=0;
return
$data;
}
}
?>
shiplu at programmer dot net
11 年前
在设置 CURLOPT_POSTFIELDS 之前应该先设置 CURLOPT_POST。否则,您可能会遇到 411 Length required 错误。

以下代码在 nginx/1.1.15 上会产生“411 Length Required”错误
<?php
curl_setopt
($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt ($ch, CURLOPT_POST, 1);
?>

但这段代码可以正常工作。

<?php
curl_setopt
($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postfields);
?>
michaeledwards.com
19 年前
如果您在重定向时将 CURLOPT_URL 与 CURLOPT_HEADERS 中的“Host:”标头混合使用,可能会出现问题,因为 cURL 会将您在“Host:”标头中明确声明的主机与重定向响应的 Location: 标头中的主机合并。

简而言之,不要这样做

<?php
$host
= "www.example.com";
$url = "http://$host/";

$headers = array("Host: $host");

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

Do
this instead:

$host = "www.example.com";
$url = "http://$host/";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
?>
php at miggy dot org
17 年前
请注意,如果您想使用代理并将其用作_缓存_,则需要执行以下操作

<?php curl_setopt($ch, CURLOPT_HTTPHEADER, array("Pragma: ")); ?>

否则,默认情况下,Curl 会在所有请求中添加“Pragma: no-cache”标头,从而强制缓存失效。
joel at mojamail dot com
6 年前
在冗长的文档中,很容易忽略这样一个事实:CURLOPT_POSTFIELDS 会将 Content-Type 设置为“multipart/form-data”(而不是通常的“application/x-www-form-urlencoded”),当且仅当您提供的是数组(而不是查询字符串)时!

一些服务器会针对错误的 Content-Type 返回奇怪的错误(例如“SSL read: error:00000000:lib(0):func(0):reason(0), errno 104”),您可能需要花费数小时才能找出原因!
qeremy [atta] gmail [dotta] com
12 年前
如果您尝试更新服务器上的内容,并且需要通过 PUT 处理此更新操作;

<?php
curl_setopt
($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_PUT, 1);
?>

在没有以下代码的情况下是“无用的”;

<?php
curl_setopt
($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
?>

示例;

更新数据库中标识为“id 1”的书籍数据;

--cURL 部分--
<?php
$data
= http_build_query($_POST);
// 或者
$data = http_build_query(array(
'name' => 'PHP in Action',
'price' => 10.9
));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.localhost/rest/books/1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // 不再需要
// 或者
// curl_setopt($ch, CURLOPT_PUT, 1); // 不再需要
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$ce = curl_exec($ch);
curl_close($ch);
print_r($ce);
?>

--API 类--
<?php
public function putAction() {
echo
"putAction() -> id: ". $this->_getParam('id') ."\n";
print_r($_POST);
// 使用 POST 数据执行操作
...
?>

--输出--
putAction() -> id: 15
Array
(
[name] => PHP in Action
[price] => 10.9
)

---关键词---
rest, restfull api, restfull put, curl put, curl customrequest put
gskluzacek at gmail dot com
13 年前
FYI... 除非您明确设置 User-Agent,否则您的请求中不会发送任何 User-Agent,因为不像其他一些选项,它没有默认值。

正如其他人所说,不发送 User-Agent 可能会导致您无法获得预期结果,例如 0 字节长度内容、不同内容等。
Andrew
15 年前
我注意到,如果您想在 curl_exec() 之后获取当前的 cookie 文件,您需要关闭当前的 curl 处理程序(就像手册中提到的那样),但是如果您想在任何 curl_exec 之后(无需 curl_close)将 cookie 转储到文件,您可以

<?php
# 正常调用
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
$result1 = curl_exec($ch);

# 然后制作一个临时副本
$ch_temp=curl_copy_handle(ch);
curl_close($ch);
$ch=$ch_temp;
?>

只有这样,如果您关闭 $ch_temp,cookie 才会被转储。
anonymous
12 年前
这可能不明显,但是如果您指定了 CURLOPT_POSTFIELDS 并且没有指定 CURLOPT_POST,它仍然会发送 POST,而不是 GET(您可能认为是 GET,因为它是默认的)。
因此,行

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);



curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

即使您按此顺序设置选项

curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

它也会发送 POST,因为 CURLOPT_POSTFIELDS 是后面的。
所以,如果您想要 GET,请确保您没有在任何地方指定 CURLOPT_POSTFIELDS。
ac at an dot y-co dot de
16 年前
如果您想连接到需要您使用证书进行身份验证的服务器,请使用以下代码。您的证书和服务器证书由一个其证书在 ca.ctr 中的机构签名。

<?php
curl_setopt
($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/cert/ca.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/cert/mycert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'password');
?>

如果您的原始证书是 .pfx 格式,您需要使用以下命令将其转换为 .pem
# openssl pkcs12 -in mycert.pfx -out mycert.key
# openssl rsa -in mycert.key -out mycert.pem
# openssl x509 -in mycert.key >> mycert.pem
Madcat
11 年前
如果您在 CURLOPT_POSTFIELDS 中混合了以 @(at 字符)开头的字符串和文件,则会遇到问题(例如,发布带有附件媒体的推文),因为 curl 会尝试将以 @ 开头的任何内容解释为文件。

<?php

$postfields
= array(
'upload_file' => '@file_to_upload.png',
'upload_text' => '@text_to_upload'
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com/upload-test');
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_exec($curl);
curl_close($curl);

?>

为了解决这个问题,请在文本字符串前面加上 NULL 字符,如下所示

<?php
$postfields
= array(
'upload_file' => '@file_to_upload.png',
'upload_text' => sprintf("\0%s", '@text_to_upload')
);
?>

原始来源:http://bit.ly/AntMle
Salil Kothadia
16 年前
在 PHP5 中,对于“CURLOPT_POSTFIELDS”选项,我们可以使用

<?php
$ch
= curl_init($URI);
$Post = http_build_query($PostData);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Post);
$Output = curl_exec($ch);
curl_close($ch);
?>
Sylvain R
15 年前
当您使用 CURLOPT_FILE 直接下载到文件时,您必须在 curl_close() 之后关闭文件句柄,否则文件将不完整,并且您将无法在 PHP 进程执行结束之前使用它。

<?php

$fh
= fopen('/tmp/foo', 'w');
$ch = curl_init('http://example.com/foo');
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_exec($ch);
curl_close($ch);

# 此时您的文件不完整且已损坏

fclose($fh);

# 现在您可以使用您的文件;

read_file('/tmp/foo');

?>
julien veneziano
14 年前
如果您需要在 DELETE 请求中发送 deta,请使用

<?php
$request_body
= 'some data';
$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
$response = curl_exec($ch);
var_dump($response);
?>
adrian at foeder dot de
12 年前
如果您想使用额外的正文数据执行 GET 请求,那么不显式地将请求更改为 POST 将变得很棘手,正如以下许多说明正确指出的那样。
因此,为了执行类似命令行的操作

curl -XGET 'http://example.org?foo=bar' -d '<baz>some additional data</baz>'

在 PHP 中,除了您需要的其他内容之外,您需要执行以下操作

<?php
curl_setopt
($curlHandle, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, '<baz>some additional data</baz>');
?>

在我的实验中,其他“类似”的方式,例如 CURLOPT_HTTPGET,并没有发送额外的數據,或者变成了 POST。
alexchexes at gmail dot com
1 年前
如果您希望 cURL 成功将 Cookie 写入使用 CURLOPT_COOKIEJAR 指定的文件,请确保 cURL 具有修改该文件的必要权限,即使该文件已存在。

我花了将近一天的时间试图理解为什么 cURL 无法将 Cookie 保存到现有文件,即使我可以轻松地使用 file_put_contents() 修改完全相同的文件。此外,cURL 本身可以创建相同的文件并保存 Cookie,但前提是它之前不存在。

最终,问题与文件所有权有关。我在 WSL2 内工作,位于符号链接的 Windows 目录中。wsl.conf 中的“[自动挂载]”元数据未设置,导致从 PHP 创建的每个文件都具有默认所有者,这与运行 PHP 的用户不同。

一旦我配置了 wsl.conf,然后将整个目录的所有权更改为与运行 PHP 的用户匹配,Cookie 就会成功写入任何文件,没有任何问题。
Niki Romagnoli
1 年前
在使用 CURLOPT_POST 和 CURLOPT_POSTFIELDS 时,设置顺序 *很重要*。
将 CURL_POST 设置为 true 将使用数组擦除任何先前的 CURLOPT_POSTFIELDS。结果是请求将是一个带有空主体 POST。

CURLOPT_POSTFIELDS 将为您设置 CURLOPT_POST 为 true,无需重复。
如果您确实需要同时设置这两个参数,那么:
- 在 CURLOPT_POSTFIELDS 之前设置 CURLOPT_POST
- 或不要使用数组,将 CURLOPT_POSTFIELDS 转换为 URL 编码字符串,它不会受到这种方式的影响(例如:<?php curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($yourArray)); ?>
To Top