PHP curl curl_setopt()函数选项合集

PHPllslx520 发表了文章 • 0 个评论 • 121 次浏览 • 2017-06-05 20:04 • 来自相关话题

组选项名称值类型描述网址CURLOPT_URLstring【必须】指定需要获取的URL地址,也可以在curl_init()函数初始化会话的时候作为参数传入。CURLOPT_PATH_AS_ISbool是否不处理URL中的"../"。(curl 7.42.0、PHP 7.0.7以上版本)CURLOPT_DEFAULT_PROTOCOLstring指定URL不带协议的时候,使用的默认协议(PHP 7.0.7以上版本)。CURLOPT_HTTP_VERSIONinteger使用的HTTP版本:CURL_HTTP_VERSION_NONE (默认值,让 curl选择),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。  CURLOPT_PORTinteger指定连接端口,替换 URL 中的主机和端口。CURLOPT_CONNECT_TOarray连接到指定的主机和端口,替换 URL 中的主机和端口。接受指定字符串格式的数组: HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT。( curl 7.49.0, PHP 7.0.7以上版本)CURLOPT_CONNECT_ONLYbool是否只做代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。重

向CURLOPT_FOLLOWLOCATIONbool【常用】是否根据服务器返回的http头"Location:"信息,自定重定向到相关页面。CURLOPT_MAXREDIRSinteger指定递归重定向的最大次数。CURLOPT_AUTOREFERERbool"Location:"重定向时,是否自动设置header的"Referer:"信息。CURLOPT_UNRESTRICTED_AUTHbool是否CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。CURLOPT_POSTREDIRinteger位掩码, 设置当CURLOPT_FOLLOWLOCATION时, 么情况下需要再次 HTTP POST 到重定向网址:
1 (301 永久重定向);
2 (302 Found)
4 (303 See Other) ,
可以使用组合的形式:,如: 1 | 2。请

头CURLOPT_HTTPGETboolTRUE时会设置http的METHOD为GET(默认即为GET,所有只有METHOD被修改时才使用此选项)。CURLOPT_CUSTOMREQUESTstringHTTP请求时,指定自定义的Method,如:GET、POST、PUT、DELETE等。CURLOPT_USERAGENTstring【常用】设置HTTP请求头"User-Agent: "字段值信息,用来伪装浏览器信息,让curl抓取更像真实的浏览器访问。CURLOPT_REFERERstring【常用】设置HTTP请求头"Referer:" 字段值信息,用来伪装来路信息,让curl抓取更像真实的浏览器访问。CURLOPT_ENCODINGstring设置HTTP请求头中"Accept-Encoding: "的值,支持的编码有"identity"、"deflate"和"gzip",如果为空字符串"",会发送所有支持的编码类型 (curl 7.10以上版本)。CURLOPT_HTTPHEADERarray【常用】以数组的形式设置http请求头信息,如:
array('Referer: http://aiezu.com', 'Accept-Language: zh-CN,zh;q=0.8')cook
iesCURLOPT_COOKIEstring【常用】设定HTTP请求头中"Cookie: "部分的内容,多个cookie用分号分隔,分号后带一个空格,如: "name=aiezu; site=aiezu.com"。CURLOPT_COOKIEFILEstring【常用】从指定文件中读取cookie,并发送到http服务,文件中的cookie必须为Netscape格式。CURLOPT_COOKIEJARstring【常用】将HTTP响应头中的cookie保存到指定文件。CURLOPT_COOKIESESSIONbool是否开启新的一次cookie会话,忽略之前存储的cookie会话信息。代理CURLOPT_HTTPPROXYTUNNELbool设置为TRUE时会通过指定的HTTP代理来传输。CURLOPT_PROXYstring【常用】指定代理信息,如:8.8.8.8:8080,socks5://8.8.8.8:88。CURLOPT_PROXYPORTstring指定代理服务器端口。CURLOPT_PROXYTYPEinteger指定代理服务器类型,支持的值:CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME;(cURL 7.10以上版本)。CURLOPT_PROXYAUTHinteger代理连接的认证方式,使用在CURLOPT_HTTPAUTH中的位掩码,当前仅支持 CURLAUTH_BASIC和CURLAUTH_NTLM (cURL 7.10以上版本)。CURLOPT_PROXYUSERPWDstring一个用来连接到代理的"[username]:[password]"格式的字符串。CURLOPT_PROXYHEADERarray传给代理的自定义HTTP头;(curl 7.37.0,  PHP 7.0.7以上版本)。CURLOPT_PROXY_SERVICE_NAMEstring代理验证服务的名称(curl 7.34.0,  PHP 7.0.7以上版本)。POST
/
PUTCURLOPT_POSTbool【常用】设置为TRUE时将强制以标准POST方式发送请求,标准POST方式HTML表单类型为"application/x-www-form-urlencoded";注意:如果此选项设置为TRUE,而CURLOPT_POSTFIELDS的参数为数组,那么数据将不会被提交到服务器。CURLOPT_POSTFIELDSarray
string【常用】指定要使用HTTP协议中的"POST"方式来发送的数据; 接受两种格式的数据类型:
1、字符串格式: 这种格式是urlencoded后的字符串,类似'para1=val1&para2=val2&...'形式,这种格式通过HTML表单类型为"application/x-www-form-urlencoded"方式提交到服务器;
2、数组格式:这种格式是以字段名为键名,字段值为键值的数组,这种格式通过HTML表单类型为"multipart/form-data"方式提交到服务器,因此,数组格式可以用来发送文件;如要发送文件,在文件名完整路径前面加上“@”前缀, 文件类型可在文件名后以 ';type=mimetype' 的格式指定;从PHP 5.5.0开始, “@“前缀已被废弃,文件可通过CURLFile 发送; 如:
array('pic'=>'@/tmp/aiezu.com.png')
换成:
array('pic'=>new CURLFile('/tmp/aiezu.com.png'))   CURLOPT_SAFE_UPLOADbool设置为TRUE时,禁用"@"前缀发送文件,以增加安全性,这时发送文件可以通过CURLFile方式;(PHP 5.5添加此选项,PHP 7移除了此选项)CURLOPT_PUTbool【常用】设置为TRUE时,允许以HTTP PUT方式发送文件,此时必须设置CURLOPT_INFILE、CURLOPT_INFILESIZE选项;CURLOPT_INFILEstring【常用】http put方式上传文件时需要读取的文件;CURLOPT_INFILESIZE integer【常用】http put方式上传文件时需要读取的文件长度;CURLOPT_READFUNCTIONfunctionR【常用】设置一个回调函数来,对HTTP PUT文件进行读取处理。此函数包含三个参数:
  参数一为curl的资源句柄;
  参数二为设置在CURLOPT_INFILE选项中,要读取文件的资源句柄;
  参数三为允许读取的最大数据数量;
函数返回当前读取到的字符串,返回空字符串作为 EOF(文件结束) 信号。认证CURLOPT_HTTPAUTHinteger【常用】使用的HTTP验证方法,可以是:CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY和 CURLAUTH_ANYSAFE,可以使用 | 位域(OR)操作符结合多个值,curl会让服务器选择支持的方法,并选择最好的那个;
  CURLAUTH_ANY是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名,
  CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。CURLOPT_USERNAMEstring【常用】验证中使用的用户名;(curl 7.19.1, PHP 5.5.0以上版本)。CURLOPT_USERPWDstring【常用】验证需要的用户名和密码,格式为:"[username]:[password]"。CURLOPT_SERVICE_NAMEstring验证服务的名称(curl 7.43.0, PHP 7.0.7以上版本)。CURLOPT_LOGIN_OPTIONSstring可以设置特定的登录选项,如通过"AUTH=NTLM" 或者"AUTH=*"设置首选的登录选项,并结合CURLOPT_USERNAME 选项使用;(curl 7.34.0, PHP 7.0.7以上版本)。CURLOPT_NETRCbool是否使用~/.netrc文件获取用户名和密码来连接远程站点。CURLOPT_KRB4LEVELstringKRB4 (Kerberos 4)安全级别,安全级别从低到高一次是:"clear"、"safe"、"confidential"、"private",默认为"private",这个选项设置为NULL时将禁用KRB4安全认证,目前 KRB4 安全认证只能用于FTP传输。CURLOPT_XOAUTH2_BEARERstring指定OAuth 2.0 access token;(curl 7.33.0, PHP 7.0.7以上版本)。证书CURLOPT_SSLCERTstring【常用】指定一个SSL证书文件名;CURLOPT_SSLCERTPASSWDstring【常用】使用CURLOPT_SSLCERT证书需要的密码;CURLOPT_SSLCERTTYPEstring指定证书格式类型,支持的格式有"PEM" (默认值)、"DER"和"ENG";    (curl 7.9.3以上版本)CURLOPT_CAPATHstring一个保存着多个CA证书的目录,这个选项配合CURLOPT_SSL_VERIFYPEER一起使用的。CURLOPT_CAINFOstring【常用】一个保存着一个或多个用来让服务端验证的证书的文件名,这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义,可能需要绝对路径。CURLOPT_SSL_VERIFYPEERbool【常用】是否禁止curl验证对等证书(peer's certificate),默认为FALSE;要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录;自cURL 7.10开始默认为 TRUE,从cURL 7.10开始默认绑定安装。CURLOPT_SSL_VERIFYSTATUSbool验证证书状态;(curl 7.41.0, PHP 7.0.7以上版本) 密钥CURLOPT_SSLKEYstring指定一个SSL私玥文件名。CURLOPT_SSLKEYPASSWDstringSSL私钥的密码;(由于此选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。)CURLOPT_KEYPASSWDstring使用CURLOPT_SSLKEY或CURLOPT_SSH_PRIVATE_KEYFILE 私钥时候的密码;(curl 7.16.1以上版本)。CURLOPT_SSLKEYTYPEstringCURLOPT_SSLKEY中指定的私钥的加密类型,支持的私钥类型为"PEM"(默认值)、"DER"和"ENG"。CURLOPT_SSLENGINEstring用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。CURLOPT_SSLENGINE_DEFAULTstring用来做非对称加密操作的变量。CURLOPT_RANDOM_FILEstring指定一个用来生成 SSL 随机数种子的文件名。CURLOPT_EGDSOCKETstringLike CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket。SSL
选项CURLOPT_SSL_FALSESTARTbool是否开启 TLS False Start (一种 TLS 握手优化方式),默认TRUE;  (curl 7.42.0, PHP 7.0.7以上版本) CURLOPT_SSL_CIPHER_LISTstring一个SSL的加密算法列表,例如RC4-SHA和TLSv1都是可用的加密列表。CURLOPT_SSL_OPTIONSinteger设置SSL行为选项,可以是:
  CURLSSLOPT_ALLOW_BEAST: do not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. 
  CURLSSLOPT_NO_REVOKE:disable certificate revocation checks for those SSL backends where such behavior is present.
(curl 7.25.0, PHP 7.0.7以上版本)CURLOPT_SSL_VERIFYHOSTinteger【常用】可能的值:
0 :为不检查名称(默认);
1 :检查服务器SSL证书中是否存在一个公用名(common name)(curl 7.28.1以下版本才支持);
2 :会检查公用名是否存在,并且是否与提供的主机名匹配。 CURLOPT_SSL_ENABLE_ALPNbool是否禁用SSL握手中的 ALPN (如果SSL后端的libcurl内建支持) 用于协商到http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)CURLOPT_SSL_ENABLE_NPNbool是否禁用SSL握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)CURLOPT_SSLVERSIONinteger指定SSL版本,CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) , CURL_SSLVERSION_TLSv1_2 (6) 中的其中一个,最好不要设置此选项,使用默认值即可,设置为 2 或 3 比较危险,在 SSLv2 和 SSLv3 中有弱点存在。CURLOPT_CERTINFObool是否将在安全传输时输出SSL证书信息到 STDERR,默认为TRUE,需要设置CURLOPT_VERBOSE选项为TRUE才有效; (curl 7.19.1, PHP 5.3.2以上版本)SSH
选项CURLOPT_SSH_PRIVATE_KEYFILEstring指定ssh私钥文件,如果未设置,默认为$HOME/.ssh/id_dsa;(curl 7.16.1以上版本)CURLOPT_SSH_PUBLIC_KEYFILEstring指定ssh公钥文件,如果未设置,默认为$HOME/.ssh/id_dsa.pub;(curl 7.16.1以上版本)CURLOPT_SSH_HOST_PUBLIC_KEY_MD5string远程主机公钥(public key) 的 MD5 校验值,有32位16进制组成,在不匹配的时候curl拒绝连接,此选项仅用于 SCP 和 SFTP 的传输;(curl 7.17.1以上版本)CURLOPT_SSH_AUTH_TYPESinteger一个或者多个有位掩码"|"连接的值,包含如下: CURLSSH_AUTH_PUBLICKEY、 CURLSSH_AUTH_PASSWORD、 CURLSSH_AUTH_HOST、 CURLSSH_AUTH_KEYBOARD,或者设置成CURLSSH_AUTH_ANY让curl自己选择; (curl 7.16.1以上版本)FTPCURLOPT_FTPPORTstring这个值将被用来获取供FTP"PORT"指令所需要的IP地址,"PORT" 指令告诉远程服务器连接到我们指定的IP地址,这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的 IP 地址。 CURLOPT_FTPSSLAUTHintegerFTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)、CURLFTPAUTH_TLS (首先尝试TLS)、CURLFTPAUTH_DEFAULT (让curl自行决定)。(curl 7.12.2以上版本)。CURLOPT_FTP_FILEMETHODinteger告诉curl使用哪种方式来获取 FTP(s) 服务器上的文件。可能的值有: CURLFTPMETHOD_MULTICWD、 CURLFTPMETHOD_NOCWD 和 CURLFTPMETHOD_SINGLECWD。(curl  7.15.1,PHP 5.3.0以上版本)。CURLOPT_TRANSFERTEXTboolFTP是否使用使用ASCII模式传输,默认为TRUE,对于LDAP,它检索纯文本信息而非 HTML,在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。CURLOPT_FTPASCIIboolCURLOPT_TRANSFERTEXT的别名。CURLOPT_FTPLISTONLYbool是否只列出 FTP 目录的名字。CURLOPT_FTPAPPENDbool是否为追加写入文件,而不是覆盖。CURLOPT_FTP_CREATE_MISSING_DIRSbool是否自动创建不存在的ftp目录。CURLOPT_QUOTEarray数组,一组先于 FTP 请求的在服务器上执行的FTP命令。 CURLOPT_POSTQUOTEarray数组,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。CURLOPT_TFTP_NO_OPTIONSbool是否不发送 TFTP 的 options 请求。(curl  7.48.0 ,PHP 7.0.7 以上版本) CURLOPT_FTP_USE_EPRTboolTRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令, 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。    CURLOPT_FTP_USE_EPSVboolTRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令,设置为 FALSE 时禁用 EPSV。断点
续传CURLOPT_RANGEstring【常用】指定字节为单位的数据获取范围,可以用”N-M”的形式,多个范围用逗号分隔,如:"0-5,100-101"(仅HTTP GET有效)。CURLOPT_RESUME_FROMinteger指定字节为单位的数据起始偏移量(仅HTTP GET有效)。速率
限制CURLOPT_LOW_SPEED_LIMITinteger传输速度,每秒字节(bytes)数,根据CURLOPT_LOW_SPEED_TIME秒数统计是否因太慢而取消传输。CURLOPT_LOW_SPEED_TIMEinteger当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会判断是否因太慢而取消传输。    CURLOPT_MAX_RECV_SPEED_LARGEinteger如果下载速度超过了此速度(以每秒字节数来统计) ,即传输过程中累计的平均数,传输就会降速到这个参数的值。默认不限速。 ( curl 7.15.5、PHP 5.4.0以上版本)CURLOPT_MAX_SEND_SPEED_LARGEintegerCURLOPT_MAX_SEND_SPEED_LARGE    如果上传的速度超过了此速度(以每秒字节数来统计),即传输过程中累计的平均数 ,传输就会降速到这个参数的值。默认不限速。  ( curl 7.15.5、PHP 5.4.0以上版本)连接
选项CURLOPT_MAXCONNECTSinteger允许的最大连接数量,达到限制时,会通过CURLOPT_CLOSEPOLICY决定应该关闭哪些连接。CURLOPT_CONNECTTIMEOUTinteger在尝试连接时等待的秒数,设置为0,则无限等待。CURLOPT_CONNECTTIMEOUT_MSinteger在尝试连接时等待的毫秒数,设置为0,则无限等待。CURLOPT_TIMEOUTinteger允许curl数执行的最长秒数。CURLOPT_TIMEOUT_MSinteger允许curl数执行的最长毫秒数。CURLOPT_EXPECT_100_TIMEOUT_MSinteger超时预计: 100毫秒内的 continue 响应 默认为 1000毫秒。(curl 7.36.0、PHP 7.0.7以上版本)CURLOPT_DNS_USE_GLOBAL_CACHEbool是否开启DNS缓存,默认TRUE。CURLOPT_DNS_CACHE_TIMEOUTinteger设置DNS在内存中缓存的时间,默认为120秒。响应
选项CURLOPT_BINARYTRANSFERbool设置CURLOPT_RETURNTRANSFER 是否以原生的(Raw)数据格式返回。 从 PHP 5.1.3 开始,此选项不再有效,永远以原生数据格式返回。CURLOPT_RETURNTRANSFERbool【常用】将curl_exec()获取的信息以字符串返回,而不是直接输出。CURLOPT_TIMECONDITIONinteger设置如何对待CURLOPT_TIMEVALUE的时间。
  CURL_TIMECOND_IFMODSINCE(默认):仅在页面CURLOPT_TIMEVALUE之后修改,才返回页面,没有修改则返回"304 Not Modified"头。
如果设置了CURLOPT_HEADER为TRUE,CURL_TIMECOND_IFUNMODSINCE则起相反的效果。 CURLOPT_TIMEVALUEinteger从1970年1月1日开始的秒数时间戳,这个时间戳提供给CURLOPT_TIMECONDITION选项判断。响

头CURLOPT_HEADERbool【常用】为TRUE时会将HTTP头/文件头信息作为数据输出。CURLOPT_WRITEHEADERstream将响应头信息的内容的写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。CURLOPT_HEADERFUNCTIONfunction【常用】设置一个回调函数来处理响应头信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应头信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入头信息;CURLINFO_HEADER_OUTbool是否追踪句柄的请求字符串。响应
BODYCURLOPT_NOBODYbool【常用】设置为TRUE时,不会再输出BODY部分,同时METHOD变成HEAD;CURLOPT_FILEstream【常用】设置响应BODY要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。CURLOPT_WRITEFUNCTIONfunction【常用】设置一个回调函数来处理响应BODY信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应BODY信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入响应BODY信息;CURLOPT_NOPROGRESSbool是否关闭进度统计功能,默认为TRUE。CURLOPT_PROGRESSFUNCTIONfunction【常用】设置一个回调函数来处理上传下载的进度,函数必须有五个参数:
参数一:是curl的资源句柄;
参数二:预计要下载的总字节(bytes)数;
参数三:目前下载的字节数;
参数四:预计传输中总上传字节数;
参数五:目前上传的字节数。
返回非零值将中断传输,并返回CURLE_ABORTED_BY_CALLBACK错误。只有设置 CURLOPT_NOPROGRESS 选项为 FALSE 时才会调用这个回调函数。调试
选项CURLOPT_VERBOSEbool【常用】curl是否输出所有调试信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件,默认为FALSE。CURLOPT_STDERRstream设置错误信息要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄,默认为STDERR。CURLOPT_NOSIGNALbool是否忽略所有的cURL传递给PHP进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。(curl 7.10以上版本)CURLOPT_FAILONERRORbool设置为TRUE时,当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。    CURLOPT_HTTP200ALIASESarray数组,HTTP 200 响应码数组,数组中的响应码被认为是正确的响应,而非错误。( curl 7.10.3以上版本)CURLOPT_FILETIMEbool是否尝试获取远程文档中的修改时间信息。获取到的修改时间可以通过 curl_getinfo()函数查看。    网络
选项CURLOPT_INTERFACEstringcurl通过指定接口(interface)进行数据传输。可以是一个网口名、IP 地址或者是一个主机名。CURLOPT_IPRESOLVEinteger允许curl选择想要解析的IP地址类别,只有在地址有多种ip类别的时候才能用,可以的值有: CURL_IPRESOLVE_WHATEVER(默认)、 CURL_IPRESOLVE_V4、 CURL_IPRESOLVE_V6 (curl 7.10.8以上版本)CURLOPT_UNIX_SOCKET_PATHstring使用指定的 Unix 套接字作为连接。(cURL 7.40.0、PHP 7.0.7以上版本)CURLOPT_FORBID_REUSEbool在完成交互以后,是否强制断开连接,此链接将不能在连接池中重用。    CURLOPT_FRESH_CONNECT 强制获取一个新的连接,而不是使用连接池中的链接。CURLOPT_TCP_NODELAYbool是否禁用 TCP 的 Nagle 算法。  CURLOPT_TCP_FASTOPENbool是否开启TCP Fast Open。( curl 7.49.0、 PHP 7.0.7以上版本)CURLOPT_SASL_IRbool是否收到首包(first packet)后发送初始的响应(initial response)。(curl 7.31.10、PHP 7.0.7以上版本)CURLOPT_STREAM_WEIGHTinteger设置 stream weight 数值 ( 1 和 256 之间的数字)。(curl 7.46.0、PHP 7.0.7以上版本) 杂项CURLOPT_CRLFbool启用时将Unix的换行符转换成回车换行符。CURLOPT_PIPEWAITbool是否等待 pipelining/multiplexing。(curl 7.43.0、PHP 7.0.7以上版本)CURLOPT_CLOSEPOLICYintegerCURLCLOSEPOLICY_* 中的一个。CURLOPT_PINNEDPUBLICKEYstringSet the pinned public key. The string can be the file name of your pinned public key. The file format expected is "PEM" or "DER". The string can also be any number of base64 encoded sha256 hashes preceded by "sha256//" and separated by ";".    Added in cURL 7.39.0. Available since PHP 7.0.7.CURLOPT_PRIVATEstringAny data that should be associated with this cURL handle. This data can subsequently be retrieved with the CURLINFO_PRIVATE option of curl_getinfo(). cURL does nothing with this data. When using a cURL multi handle, this private data is typically a unique key to identify a standard cURL handle.    Added in cURL 7.10.3. 参考页面:php官网关于curl组件介绍:http://php.net/curl
PHP curl简单用法举例:http://aiezu.com/article/php_curl.html
php curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.php 查看全部
选项名称值类型描述
网址CURLOPT_URLstring【必须】指定需要获取的URL地址,也可以在curl_init()函数初始化会话的时候作为参数传入。
CURLOPT_PATH_AS_ISbool是否不处理URL中的"../"。(curl 7.42.0、PHP 7.0.7以上版本)
CURLOPT_DEFAULT_PROTOCOLstring指定URL不带协议的时候,使用的默认协议(PHP 7.0.7以上版本)。
CURLOPT_HTTP_VERSIONinteger使用的HTTP版本:CURL_HTTP_VERSION_NONE (默认值,让 curl选择),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。  
CURLOPT_PORTinteger指定连接端口,替换 URL 中的主机和端口。
CURLOPT_CONNECT_TOarray连接到指定的主机和端口,替换 URL 中的主机和端口。接受指定字符串格式的数组: HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT。( curl 7.49.0, PHP 7.0.7以上版本)
CURLOPT_CONNECT_ONLYbool是否只做代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。


CURLOPT_FOLLOWLOCATIONbool【常用】是否根据服务器返回的http头"Location:"信息,自定重定向到相关页面。
CURLOPT_MAXREDIRSinteger指定递归重定向的最大次数。
CURLOPT_AUTOREFERERbool"Location:"重定向时,是否自动设置header的"Referer:"信息。
CURLOPT_UNRESTRICTED_AUTHbool是否CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。
CURLOPT_POSTREDIRinteger位掩码, 设置当CURLOPT_FOLLOWLOCATION时, 么情况下需要再次 HTTP POST 到重定向网址:
1 (301 永久重定向);
2 (302 Found)
4 (303 See Other) ,
可以使用组合的形式:,如: 1 | 2。


CURLOPT_HTTPGETboolTRUE时会设置http的METHOD为GET(默认即为GET,所有只有METHOD被修改时才使用此选项)。
CURLOPT_CUSTOMREQUESTstringHTTP请求时,指定自定义的Method,如:GET、POST、PUT、DELETE等。
CURLOPT_USERAGENTstring【常用】设置HTTP请求头"User-Agent: "字段值信息,用来伪装浏览器信息,让curl抓取更像真实的浏览器访问。
CURLOPT_REFERERstring【常用】设置HTTP请求头"Referer:" 字段值信息,用来伪装来路信息,让curl抓取更像真实的浏览器访问。
CURLOPT_ENCODINGstring设置HTTP请求头中"Accept-Encoding: "的值,支持的编码有"identity"、"deflate"和"gzip",如果为空字符串"",会发送所有支持的编码类型 (curl 7.10以上版本)。
CURLOPT_HTTPHEADERarray【常用】以数组的形式设置http请求头信息,如:
array('Referer: http://aiezu.com', 'Accept-Language: zh-CN,zh;q=0.8')
cook
ies
CURLOPT_COOKIEstring【常用】设定HTTP请求头中"Cookie: "部分的内容,多个cookie用分号分隔,分号后带一个空格,如: "name=aiezu; site=aiezu.com"。
CURLOPT_COOKIEFILEstring【常用】从指定文件中读取cookie,并发送到http服务,文件中的cookie必须为Netscape格式。
CURLOPT_COOKIEJARstring【常用】将HTTP响应头中的cookie保存到指定文件。
CURLOPT_COOKIESESSIONbool是否开启新的一次cookie会话,忽略之前存储的cookie会话信息。
代理CURLOPT_HTTPPROXYTUNNELbool设置为TRUE时会通过指定的HTTP代理来传输。
CURLOPT_PROXYstring【常用】指定代理信息,如:8.8.8.8:8080,socks5://8.8.8.8:88。
CURLOPT_PROXYPORTstring指定代理服务器端口。
CURLOPT_PROXYTYPEinteger指定代理服务器类型,支持的值:CURLPROXY_HTTP (默认值) CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A 或 CURLPROXY_SOCKS5_HOSTNAME;(cURL 7.10以上版本)。
CURLOPT_PROXYAUTHinteger代理连接的认证方式,使用在CURLOPT_HTTPAUTH中的位掩码,当前仅支持 CURLAUTH_BASIC和CURLAUTH_NTLM (cURL 7.10以上版本)。
CURLOPT_PROXYUSERPWDstring一个用来连接到代理的"[username]:[password]"格式的字符串。
CURLOPT_PROXYHEADERarray传给代理的自定义HTTP头;(curl 7.37.0,  PHP 7.0.7以上版本)。
CURLOPT_PROXY_SERVICE_NAMEstring代理验证服务的名称(curl 7.34.0,  PHP 7.0.7以上版本)。
POST
/
PUT
CURLOPT_POSTbool【常用】设置为TRUE时将强制以标准POST方式发送请求,标准POST方式HTML表单类型为"application/x-www-form-urlencoded";注意:如果此选项设置为TRUE,而CURLOPT_POSTFIELDS的参数为数组,那么数据将不会被提交到服务器。
CURLOPT_POSTFIELDSarray
string
【常用】指定要使用HTTP协议中的"POST"方式来发送的数据; 接受两种格式的数据类型:
1、字符串格式: 这种格式是urlencoded后的字符串,类似'para1=val1&para2=val2&...'形式,这种格式通过HTML表单类型为"application/x-www-form-urlencoded"方式提交到服务器;
2、数组格式:这种格式是以字段名为键名,字段值为键值的数组,这种格式通过HTML表单类型为"multipart/form-data"方式提交到服务器,因此,数组格式可以用来发送文件;如要发送文件,在文件名完整路径前面加上“@”前缀, 文件类型可在文件名后以 ';type=mimetype' 的格式指定;从PHP 5.5.0开始, “@“前缀已被废弃,文件可通过CURLFile 发送; 如:
array('pic'=>'@/tmp/aiezu.com.png')
换成:
array('pic'=>new CURLFile('/tmp/aiezu.com.png'))
   
CURLOPT_SAFE_UPLOADbool设置为TRUE时,禁用"@"前缀发送文件,以增加安全性,这时发送文件可以通过CURLFile方式;(PHP 5.5添加此选项,PHP 7移除了此选项)
CURLOPT_PUTbool【常用】设置为TRUE时,允许以HTTP PUT方式发送文件,此时必须设置CURLOPT_INFILE、CURLOPT_INFILESIZE选项;
CURLOPT_INFILEstring【常用】http put方式上传文件时需要读取的文件;
CURLOPT_INFILESIZE integer【常用】http put方式上传文件时需要读取的文件长度;
CURLOPT_READFUNCTIONfunctionR【常用】设置一个回调函数来,对HTTP PUT文件进行读取处理。此函数包含三个参数:
  参数一为curl的资源句柄;
  参数二为设置在CURLOPT_INFILE选项中,要读取文件的资源句柄;
  参数三为允许读取的最大数据数量;
函数返回当前读取到的字符串,返回空字符串作为 EOF(文件结束) 信号。
认证CURLOPT_HTTPAUTHinteger【常用】使用的HTTP验证方法,可以是:CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY和 CURLAUTH_ANYSAFE,可以使用 | 位域(OR)操作符结合多个值,curl会让服务器选择支持的方法,并选择最好的那个;
  CURLAUTH_ANY是 CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名,
  CURLAUTH_ANYSAFE 是 CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM 的别名。
CURLOPT_USERNAMEstring【常用】验证中使用的用户名;(curl 7.19.1, PHP 5.5.0以上版本)。
CURLOPT_USERPWDstring【常用】验证需要的用户名和密码,格式为:"[username]:[password]"。
CURLOPT_SERVICE_NAMEstring验证服务的名称(curl 7.43.0, PHP 7.0.7以上版本)。
CURLOPT_LOGIN_OPTIONSstring可以设置特定的登录选项,如通过"AUTH=NTLM" 或者"AUTH=*"设置首选的登录选项,并结合CURLOPT_USERNAME 选项使用;(curl 7.34.0, PHP 7.0.7以上版本)。
CURLOPT_NETRCbool是否使用~/.netrc文件获取用户名和密码来连接远程站点。
CURLOPT_KRB4LEVELstringKRB4 (Kerberos 4)安全级别,安全级别从低到高一次是:"clear"、"safe"、"confidential"、"private",默认为"private",这个选项设置为NULL时将禁用KRB4安全认证,目前 KRB4 安全认证只能用于FTP传输。
CURLOPT_XOAUTH2_BEARERstring指定OAuth 2.0 access token;(curl 7.33.0, PHP 7.0.7以上版本)。
证书CURLOPT_SSLCERTstring【常用】指定一个SSL证书文件名;
CURLOPT_SSLCERTPASSWDstring【常用】使用CURLOPT_SSLCERT证书需要的密码;
CURLOPT_SSLCERTTYPEstring指定证书格式类型,支持的格式有"PEM" (默认值)、"DER"和"ENG";    (curl 7.9.3以上版本)
CURLOPT_CAPATHstring一个保存着多个CA证书的目录,这个选项配合CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_CAINFOstring【常用】一个保存着一个或多个用来让服务端验证的证书的文件名,这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义,可能需要绝对路径。
CURLOPT_SSL_VERIFYPEERbool【常用】是否禁止curl验证对等证书(peer's certificate),默认为FALSE;要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录;自cURL 7.10开始默认为 TRUE,从cURL 7.10开始默认绑定安装。
CURLOPT_SSL_VERIFYSTATUSbool验证证书状态;(curl 7.41.0, PHP 7.0.7以上版本) 
密钥CURLOPT_SSLKEYstring指定一个SSL私玥文件名。
CURLOPT_SSLKEYPASSWDstringSSL私钥的密码;(由于此选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。)
CURLOPT_KEYPASSWDstring使用CURLOPT_SSLKEY或CURLOPT_SSH_PRIVATE_KEYFILE 私钥时候的密码;(curl 7.16.1以上版本)。
CURLOPT_SSLKEYTYPEstringCURLOPT_SSLKEY中指定的私钥的加密类型,支持的私钥类型为"PEM"(默认值)、"DER"和"ENG"。
CURLOPT_SSLENGINEstring用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。
CURLOPT_SSLENGINE_DEFAULTstring用来做非对称加密操作的变量。
CURLOPT_RANDOM_FILEstring指定一个用来生成 SSL 随机数种子的文件名。
CURLOPT_EGDSOCKETstringLike CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket。
SSL
选项
CURLOPT_SSL_FALSESTARTbool是否开启 TLS False Start (一种 TLS 握手优化方式),默认TRUE;  (curl 7.42.0, PHP 7.0.7以上版本) 
CURLOPT_SSL_CIPHER_LISTstring一个SSL的加密算法列表,例如RC4-SHA和TLSv1都是可用的加密列表。
CURLOPT_SSL_OPTIONSinteger设置SSL行为选项,可以是:
  CURLSSLOPT_ALLOW_BEAST: do not attempt to use any workarounds for a security flaw in the SSL3 and TLS1.0 protocols. 
  CURLSSLOPT_NO_REVOKE:disable certificate revocation checks for those SSL backends where such behavior is present.
(curl 7.25.0, PHP 7.0.7以上版本)
CURLOPT_SSL_VERIFYHOSTinteger【常用】可能的值:
0 :为不检查名称(默认);
1 :检查服务器SSL证书中是否存在一个公用名(common name)(curl 7.28.1以下版本才支持);
2 :会检查公用名是否存在,并且是否与提供的主机名匹配。 
CURLOPT_SSL_ENABLE_ALPNbool是否禁用SSL握手中的 ALPN (如果SSL后端的libcurl内建支持) 用于协商到http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSL_ENABLE_NPNbool是否禁用SSL握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2,默认为FALSE;  (curl 7.36.0, PHP 7.0.7以上版本)
CURLOPT_SSLVERSIONinteger指定SSL版本,CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) , CURL_SSLVERSION_TLSv1_2 (6) 中的其中一个,最好不要设置此选项,使用默认值即可,设置为 2 或 3 比较危险,在 SSLv2 和 SSLv3 中有弱点存在。
CURLOPT_CERTINFObool是否将在安全传输时输出SSL证书信息到 STDERR,默认为TRUE,需要设置CURLOPT_VERBOSE选项为TRUE才有效; (curl 7.19.1, PHP 5.3.2以上版本)
SSH
选项
CURLOPT_SSH_PRIVATE_KEYFILEstring指定ssh私钥文件,如果未设置,默认为$HOME/.ssh/id_dsa;(curl 7.16.1以上版本)
CURLOPT_SSH_PUBLIC_KEYFILEstring指定ssh公钥文件,如果未设置,默认为$HOME/.ssh/id_dsa.pub;(curl 7.16.1以上版本)
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5string远程主机公钥(public key) 的 MD5 校验值,有32位16进制组成,在不匹配的时候curl拒绝连接,此选项仅用于 SCP 和 SFTP 的传输;(curl 7.17.1以上版本)
CURLOPT_SSH_AUTH_TYPESinteger一个或者多个有位掩码"|"连接的值,包含如下: CURLSSH_AUTH_PUBLICKEY、 CURLSSH_AUTH_PASSWORD、 CURLSSH_AUTH_HOST、 CURLSSH_AUTH_KEYBOARD,或者设置成CURLSSH_AUTH_ANY让curl自己选择; (curl 7.16.1以上版本)
FTPCURLOPT_FTPPORTstring这个值将被用来获取供FTP"PORT"指令所需要的IP地址,"PORT" 指令告诉远程服务器连接到我们指定的IP地址,这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的 IP 地址。 
CURLOPT_FTPSSLAUTHintegerFTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)、CURLFTPAUTH_TLS (首先尝试TLS)、CURLFTPAUTH_DEFAULT (让curl自行决定)。(curl 7.12.2以上版本)。
CURLOPT_FTP_FILEMETHODinteger告诉curl使用哪种方式来获取 FTP(s) 服务器上的文件。可能的值有: CURLFTPMETHOD_MULTICWD、 CURLFTPMETHOD_NOCWD 和 CURLFTPMETHOD_SINGLECWD。(curl  7.15.1,PHP 5.3.0以上版本)。
CURLOPT_TRANSFERTEXTboolFTP是否使用使用ASCII模式传输,默认为TRUE,对于LDAP,它检索纯文本信息而非 HTML,在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。
CURLOPT_FTPASCIIboolCURLOPT_TRANSFERTEXT的别名。
CURLOPT_FTPLISTONLYbool是否只列出 FTP 目录的名字。
CURLOPT_FTPAPPENDbool是否为追加写入文件,而不是覆盖。
CURLOPT_FTP_CREATE_MISSING_DIRSbool是否自动创建不存在的ftp目录。
CURLOPT_QUOTEarray数组,一组先于 FTP 请求的在服务器上执行的FTP命令。 
CURLOPT_POSTQUOTEarray数组,在 FTP 请求执行完成后,在服务器上执行的一组array格式的 FTP 命令。
CURLOPT_TFTP_NO_OPTIONSbool是否不发送 TFTP 的 options 请求。(curl  7.48.0 ,PHP 7.0.7 以上版本) 
CURLOPT_FTP_USE_EPRTboolTRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令, 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。    
CURLOPT_FTP_USE_EPSVboolTRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令,设置为 FALSE 时禁用 EPSV。
断点
续传
CURLOPT_RANGEstring【常用】指定字节为单位的数据获取范围,可以用”N-M”的形式,多个范围用逗号分隔,如:"0-5,100-101"(仅HTTP GET有效)。
CURLOPT_RESUME_FROMinteger指定字节为单位的数据起始偏移量(仅HTTP GET有效)。
速率
限制
CURLOPT_LOW_SPEED_LIMITinteger传输速度,每秒字节(bytes)数,根据CURLOPT_LOW_SPEED_TIME秒数统计是否因太慢而取消传输。
CURLOPT_LOW_SPEED_TIMEinteger当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会判断是否因太慢而取消传输。    
CURLOPT_MAX_RECV_SPEED_LARGEinteger如果下载速度超过了此速度(以每秒字节数来统计) ,即传输过程中累计的平均数,传输就会降速到这个参数的值。默认不限速。 ( curl 7.15.5、PHP 5.4.0以上版本)
CURLOPT_MAX_SEND_SPEED_LARGEintegerCURLOPT_MAX_SEND_SPEED_LARGE    如果上传的速度超过了此速度(以每秒字节数来统计),即传输过程中累计的平均数 ,传输就会降速到这个参数的值。默认不限速。  ( curl 7.15.5、PHP 5.4.0以上版本)
连接
选项
CURLOPT_MAXCONNECTSinteger允许的最大连接数量,达到限制时,会通过CURLOPT_CLOSEPOLICY决定应该关闭哪些连接。
CURLOPT_CONNECTTIMEOUTinteger在尝试连接时等待的秒数,设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MSinteger在尝试连接时等待的毫秒数,设置为0,则无限等待。
CURLOPT_TIMEOUTinteger允许curl数执行的最长秒数。
CURLOPT_TIMEOUT_MSinteger允许curl数执行的最长毫秒数。
CURLOPT_EXPECT_100_TIMEOUT_MSinteger超时预计: 100毫秒内的 continue 响应 默认为 1000毫秒。(curl 7.36.0、PHP 7.0.7以上版本)
CURLOPT_DNS_USE_GLOBAL_CACHEbool是否开启DNS缓存,默认TRUE。
CURLOPT_DNS_CACHE_TIMEOUTinteger设置DNS在内存中缓存的时间,默认为120秒。
响应
选项
CURLOPT_BINARYTRANSFERbool设置CURLOPT_RETURNTRANSFER 是否以原生的(Raw)数据格式返回。 从 PHP 5.1.3 开始,此选项不再有效,永远以原生数据格式返回。
CURLOPT_RETURNTRANSFERbool【常用】将curl_exec()获取的信息以字符串返回,而不是直接输出。
CURLOPT_TIMECONDITIONinteger设置如何对待CURLOPT_TIMEVALUE的时间。
  CURL_TIMECOND_IFMODSINCE(默认):仅在页面CURLOPT_TIMEVALUE之后修改,才返回页面,没有修改则返回"304 Not Modified"头。
如果设置了CURLOPT_HEADER为TRUE,CURL_TIMECOND_IFUNMODSINCE则起相反的效果。 
CURLOPT_TIMEVALUEinteger从1970年1月1日开始的秒数时间戳,这个时间戳提供给CURLOPT_TIMECONDITION选项判断。


CURLOPT_HEADERbool【常用】为TRUE时会将HTTP头/文件头信息作为数据输出。
CURLOPT_WRITEHEADERstream将响应头信息的内容的写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_HEADERFUNCTIONfunction【常用】设置一个回调函数来处理响应头信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应头信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入头信息;
CURLINFO_HEADER_OUTbool是否追踪句柄的请求字符串。
响应
BODY
CURLOPT_NOBODYbool【常用】设置为TRUE时,不会再输出BODY部分,同时METHOD变成HEAD;
CURLOPT_FILEstream【常用】设置响应BODY要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄。
CURLOPT_WRITEFUNCTIONfunction【常用】设置一个回调函数来处理响应BODY信息,此函数必须包含两个参数,参数一为curl的资源句柄,参数二为curl传入的响应BODY信息,函数必须返回参数二的长度,用来告诉curl成功接收到了传入响应BODY信息;
CURLOPT_NOPROGRESSbool是否关闭进度统计功能,默认为TRUE。
CURLOPT_PROGRESSFUNCTIONfunction【常用】设置一个回调函数来处理上传下载的进度,函数必须有五个参数:
参数一:是curl的资源句柄;
参数二:预计要下载的总字节(bytes)数;
参数三:目前下载的字节数;
参数四:预计传输中总上传字节数;
参数五:目前上传的字节数。
返回非零值将中断传输,并返回CURLE_ABORTED_BY_CALLBACK错误。只有设置 CURLOPT_NOPROGRESS 选项为 FALSE 时才会调用这个回调函数。
调试
选项
CURLOPT_VERBOSEbool【常用】curl是否输出所有调试信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件,默认为FALSE。
CURLOPT_STDERRstream设置错误信息要写入到指定地方,如写入到文件,则传fopen()函数返回的流资源句柄,默认为STDERR。
CURLOPT_NOSIGNALbool是否忽略所有的cURL传递给PHP进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。(curl 7.10以上版本)
CURLOPT_FAILONERRORbool设置为TRUE时,当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。    
CURLOPT_HTTP200ALIASESarray数组,HTTP 200 响应码数组,数组中的响应码被认为是正确的响应,而非错误。( curl 7.10.3以上版本)
CURLOPT_FILETIMEbool是否尝试获取远程文档中的修改时间信息。获取到的修改时间可以通过 curl_getinfo()函数查看。    
网络
选项
CURLOPT_INTERFACEstringcurl通过指定接口(interface)进行数据传输。可以是一个网口名、IP 地址或者是一个主机名。
CURLOPT_IPRESOLVEinteger允许curl选择想要解析的IP地址类别,只有在地址有多种ip类别的时候才能用,可以的值有: CURL_IPRESOLVE_WHATEVER(默认)、 CURL_IPRESOLVE_V4、 CURL_IPRESOLVE_V6 (curl 7.10.8以上版本)
CURLOPT_UNIX_SOCKET_PATHstring使用指定的 Unix 套接字作为连接。(cURL 7.40.0、PHP 7.0.7以上版本)
CURLOPT_FORBID_REUSEbool在完成交互以后,是否强制断开连接,此链接将不能在连接池中重用。    
CURLOPT_FRESH_CONNECT 强制获取一个新的连接,而不是使用连接池中的链接。
CURLOPT_TCP_NODELAYbool是否禁用 TCP 的 Nagle 算法。  
CURLOPT_TCP_FASTOPENbool是否开启TCP Fast Open。( curl 7.49.0、 PHP 7.0.7以上版本)
CURLOPT_SASL_IRbool是否收到首包(first packet)后发送初始的响应(initial response)。(curl 7.31.10、PHP 7.0.7以上版本)
CURLOPT_STREAM_WEIGHTinteger设置 stream weight 数值 ( 1 和 256 之间的数字)。(curl 7.46.0、PHP 7.0.7以上版本) 
杂项CURLOPT_CRLFbool启用时将Unix的换行符转换成回车换行符。
CURLOPT_PIPEWAITbool是否等待 pipelining/multiplexing。(curl 7.43.0、PHP 7.0.7以上版本)
CURLOPT_CLOSEPOLICYintegerCURLCLOSEPOLICY_* 中的一个。
CURLOPT_PINNEDPUBLICKEYstringSet the pinned public key. The string can be the file name of your pinned public key. The file format expected is "PEM" or "DER". The string can also be any number of base64 encoded sha256 hashes preceded by "sha256//" and separated by ";".    Added in cURL 7.39.0. Available since PHP 7.0.7.
CURLOPT_PRIVATEstringAny data that should be associated with this cURL handle. This data can subsequently be retrieved with the CURLINFO_PRIVATE option of curl_getinfo(). cURL does nothing with this data. When using a cURL multi handle, this private data is typically a unique key to identify a standard cURL handle.    Added in cURL 7.10.3.
 

参考页面:

php官网关于curl组件介绍:http://php.net/curl
PHP curl简单用法举例:http://aiezu.com/article/php_curl.html
php curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.php

PHP curl简单用法举例和相关函数介绍

PHPllslx520 发表了文章 • 0 个评论 • 111 次浏览 • 2017-06-04 22:24 • 来自相关话题

一、PHP curl抓取代码编写流程:使用PHP curl执行抓取请求分为下面基本四步:使用 curl_init() 函数创建一个curl句柄;使用 curl_setopt() 函数为curl句柄设置相应选项,php curl的丰富功能依靠此函数的设置来实现;使用 curl_exec() 函数执行抓取请求;使用 curl_close() 函数关闭curl句柄,释放内存;  二、PHP curl最基本用法:  下面使用简单的例子,通过使用php curl抓取本站首页源代码长度,介绍php curl的基本用法。注意CURLOPT_RETURNTRANSFER选项十分重要,作用为执行curl_exec函数时,是否返回curl传输内容到变量,默认为否,会直接将内容输出网页。<?php
// 创建一个curl句柄
$ch = curl_init();
// 设置访问的URL
curl_setopt($ch, CURLOPT_URL, "http://aiezu.com");
// 将curl请求执行时,将结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行curl请求,返回结果到变量
$html = curl_exec($ch);
// 关闭curl句柄
curl_close($ch);
echo strlen($html);运行结果:96161 三、PHP curl GET请求和POST请求:1、php curl get请求:<?php
$data = array('sex'=>1, 'age'=>18);
$url = sprintf("http://aiezu.com/test.php?%s", http_build_query($data));
// $url: http://aiezu.com/test.php?sex=1&age=18

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
echo $html;输出结果:[REQUEST_METHOD]: GET

$_GET:
Array
(
[sex] => 1
[age] => 18
) 
2、php curl post 提交数据:<?php
$data = array('name'=>'爱E族', 'domain'=>'aiezu.com');
$url = "http://aiezu.com/test.php";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 告诉curl使用POST的方式提交
curl_setopt($ch, CURLOPT_POST, 1);
// 设置要POST提交的数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$html = curl_exec($ch);
curl_close($ch);
echo $html;输出结果:[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 250
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------39f5fe9c583c

$_POST:
Array
(
[name] => 爱E族
[domain] => aiezu.com
) 四、PHP curl组件相关函数:  PHP curl组件相关函数功能介绍: 函数名函数介绍基


数curl_init【常用】初始化一个curl会话,返回一个curl句柄;curl_setopt【常用】设置curl选项,具体选项介绍请参考php官方介绍:curl_setopt;curl_setopt_array【常用】使用数组的方式批量设置curl选项;curl_copy_handle克隆一个curl句柄和它的所有选项;curl_exec【常用】执行curl会话;curl_pause 暂停并取消暂停一个连接(PHP 5.5以上版本);curl_reset将curl句柄的所有curl选项重置为默认值(PHP 5.5以上版本);curl_getinfo获取curl最后会话信息,包含消耗时间、上传下载字节数、传输速度等信息;curl_errno返回curl会话最后一次的数字错误代码;curl_error返回curl会话最后一次的字符串错误描述;curl_strerror通过curl数字错误代码返回字符串描述(PHP 5.5以上版本);curl_close【常用】关闭curl会话;curl_escape 对指定字符串进行URL编码(PHP 5.5以上版本);curl_unescape 对指定字符串进行URL解码(PHP 5.5以上版本);curl_version以数组的形式返回php curl版本信息;批

理curl_multi_init创建一个curl批处理句柄(并发请求);curl_multi_add_handle向curl批处理句柄中添加单独的curl句柄;curl_multi_remove_handle从curl批处理句柄中移除某个curl句柄;curl_multi_setopt为curl批处理句柄设置选项;curl_multi_exec执行curl批处理句柄;curl_multi_info_read尝试从curl批处理句柄中获取 新curl子请求的完成信息;curl_multi_getcontent读取curl批处理句柄中curl子句柄的请求返回内容;curl_multi_close关闭curl批处理句柄;curl_multi_select 等待所有curl批处理中的活动连接;curl_multi_strerror通过curl批处理数字错误代码返回字符串描述(PHP 5.5以上版本);共


柄curl_share_init初始化一个curl共享句柄(PHP 5.5以上版本);curl_share_setopt为 curl共享句柄设置选项(PHP 5.5以上版本);curl_share_close关闭curl共享句柄(PHP 5.5以上版本);其
他curl_file_create创建一个curlfile对象(PHP 5.5以上版本); 五、参考资料:php官网关于curl组件介绍:http://php.net/curlphp curl选项官方介绍:http://php.net/manual/zh/function.curl-setopt.phpphp curl选项爱E族整理:https://aiezu.com/article/php_curl_curl_setopt_sets.html 查看全部

一、PHP curl抓取代码编写流程:

使用PHP curl执行抓取请求分为下面基本四步:
  1. 使用 curl_init() 函数创建一个curl句柄;
  2. 使用 curl_setopt() 函数为curl句柄设置相应选项,php curl的丰富功能依靠此函数的设置来实现;
  3. 使用 curl_exec() 函数执行抓取请求;
  4. 使用 curl_close() 函数关闭curl句柄,释放内存;
  

二、PHP curl最基本用法:

  下面使用简单的例子,通过使用php curl抓取本站首页源代码长度,介绍php curl的基本用法。注意CURLOPT_RETURNTRANSFER选项十分重要,作用为执行curl_exec函数时,是否返回curl传输内容到变量,默认为否,会直接将内容输出网页。
<?php
// 创建一个curl句柄
$ch = curl_init();
// 设置访问的URL
curl_setopt($ch, CURLOPT_URL, "http://aiezu.com");
// 将curl请求执行时,将结果返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 执行curl请求,返回结果到变量
$html = curl_exec($ch);
// 关闭curl句柄
curl_close($ch);
echo strlen($html);
运行结果:
96161
 

三、PHP curl GET请求和POST请求:

1、php curl get请求:

<?php
$data = array('sex'=>1, 'age'=>18);
$url = sprintf("http://aiezu.com/test.php?%s", http_build_query($data));
// $url: http://aiezu.com/test.php?sex=1&age=18

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
输出结果:
[REQUEST_METHOD]: GET

$_GET:
Array
(
[sex] => 1
[age] => 18
)
 
2、php curl post 提交数据:
<?php
$data = array('name'=>'爱E族', 'domain'=>'aiezu.com');
$url = "http://aiezu.com/test.php";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 告诉curl使用POST的方式提交
curl_setopt($ch, CURLOPT_POST, 1);
// 设置要POST提交的数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$html = curl_exec($ch);
curl_close($ch);
echo $html;
输出结果:
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 250
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------39f5fe9c583c

$_POST:
Array
(
[name] => 爱E族
[domain] => aiezu.com
)
 

四、PHP curl组件相关函数:

  PHP curl组件相关函数功能介绍:
 函数名函数介绍



curl_init【常用】初始化一个curl会话,返回一个curl句柄;
curl_setopt【常用】设置curl选项,具体选项介绍请参考php官方介绍:curl_setopt;
curl_setopt_array【常用】使用数组的方式批量设置curl选项;
curl_copy_handle克隆一个curl句柄和它的所有选项;
curl_exec【常用】执行curl会话;
curl_pause 暂停并取消暂停一个连接(PHP 5.5以上版本);
curl_reset将curl句柄的所有curl选项重置为默认值(PHP 5.5以上版本);
curl_getinfo获取curl最后会话信息,包含消耗时间、上传下载字节数、传输速度等信息;
curl_errno返回curl会话最后一次的数字错误代码;
curl_error返回curl会话最后一次的字符串错误描述;
curl_strerror通过curl数字错误代码返回字符串描述(PHP 5.5以上版本);
curl_close【常用】关闭curl会话;
curl_escape 对指定字符串进行URL编码(PHP 5.5以上版本);
curl_unescape 对指定字符串进行URL解码(PHP 5.5以上版本);
curl_version以数组的形式返回php curl版本信息;


curl_multi_init创建一个curl批处理句柄(并发请求);
curl_multi_add_handle向curl批处理句柄中添加单独的curl句柄;
curl_multi_remove_handle从curl批处理句柄中移除某个curl句柄;
curl_multi_setopt为curl批处理句柄设置选项;
curl_multi_exec执行curl批处理句柄;
curl_multi_info_read尝试从curl批处理句柄中获取 新curl子请求的完成信息;
curl_multi_getcontent读取curl批处理句柄中curl子句柄的请求返回内容;
curl_multi_close关闭curl批处理句柄;
curl_multi_select 等待所有curl批处理中的活动连接;
curl_multi_strerror通过curl批处理数字错误代码返回字符串描述(PHP 5.5以上版本);



curl_share_init初始化一个curl共享句柄(PHP 5.5以上版本);
curl_share_setopt为 curl共享句柄设置选项(PHP 5.5以上版本);
curl_share_close关闭curl共享句柄(PHP 5.5以上版本);

curl_file_create创建一个curlfile对象(PHP 5.5以上版本);
 

五、参考资料:

php unicode与中文互转

PHPllslx520 发表了文章 • 0 个评论 • 187 次浏览 • 2017-05-05 23:15 • 来自相关话题

一、使用json_encode和json_decode函数:1、使用json_decode()函数将unicode编码转换为中文汉字:<?php
$str = "\u597d\u597d\u5b66\u4e60\u5929\u5929\u5411\u4e0a";
# echo json_decode($str); # 错误
echo json_decode(sprintf('"%s"', $str)); #正确输出:好好学习天天向上注意:需要在要转换成中文的unicode字符串两边添加双引号后,才能使用json_decode()正确的转换成中文。 
 2、使用json_encode()函数将中文转换为unicode编码:<?php
$str = "爱E族:aiezu.com";
echo json_encode($str);输出:"\u7231E\u65cf\uff1aaiezu.com"注意:使用json_encode()函数将中文转换成unicode编码后,首尾会多出两个双引号,需要自行去掉。 查看全部

一、使用json_encodejson_decode函数:

1、使用json_decode()函数将unicode编码转换为中文汉字:

<?php
$str = "\u597d\u597d\u5b66\u4e60\u5929\u5929\u5411\u4e0a";
# echo json_decode($str); # 错误
echo json_decode(sprintf('"%s"', $str)); #正确
输出:
好好学习天天向上
注意:需要在要转换成中文的unicode字符串两边添加双引号后,才能使用json_decode()正确的转换成中文。 
 

2、使用json_encode()函数将中文转换为unicode编码:

<?php
$str = "爱E族:aiezu.com";
echo json_encode($str);
输出:
"\u7231E\u65cf\uff1aaiezu.com"
注意:使用json_encode()函数将中文转换成unicode编码后,首尾会多出两个双引号,需要自行去掉。

Vim快速为PHP代码文件头添加copyright版权信息

PHPllslx520 发表了文章 • 0 个评论 • 303 次浏览 • 2017-04-14 22:49 • 来自相关话题

1、修改~/.vimrc文件:  使用vim编辑~/.vimrc文件,在文件尾部添加如下代码:map <F4> :call TitleDet()<cr>'s
function AddTitle()
call append(1,"/*=============================================================================")
call append(2,"# Author: Aiezu.com - xxxx@qq.com")
call append(3,"# Last modified: " . strftime("%Y-%m-%d %H:%M"))
call append(4,"# Filename: " . expand("%:t"))
call append(5,"# Description: ")
call append(6,"=============================================================================*/")
echohl WarningMsg | echo "Successful in adding the copyright." | echohl None
endf

function UpdateTitle()
normal m'
execute '/# *Last modified:/s@:.*\=strftime(":\t%Y-%m-%d %H:%M")@'
normal ''
normal mk
execute '/# *Filename:/s@:.*\=":\t\t".expand("%:t")@'
execute "noh"
normal 'k
echohl WarningMsg | echo "Successful in updating the copy right." | echohl None
endfunction

function TitleDet()
let n=1
while n < 7
let line = getline(n)
if line =~ '^\#\s*\S*Last\smodified:\S*.*$'
call UpdateTitle()
return
endif
let n = n + 1
endwhile

call AddTitle()
endfunction上面代码中的append函数的第一个参数是在指定的行后面插入内容,这里从第一行后面开始插入(第一行留给"<?php")。 
 
小贴士:如果上面的代码粘贴到vim中格式乱了,可以使用shell中输入"cat <<END>> ~/.vimrc"回车,再粘贴代码,再输入字符"END",完成追加代码到文件。
 2、 快速添加版权信息测试:  按上面要求修改~/.vimrc文件并保存后,使用vim随便打开一个php文件,按F4,恭喜,神奇的一幕发生了。 查看全部

1、修改~/.vimrc文件:

  使用vim编辑~/.vimrc文件,在文件尾部添加如下代码:
map <F4> :call TitleDet()<cr>'s
function AddTitle()
call append(1,"/*=============================================================================")
call append(2,"# Author: Aiezu.com - xxxx@qq.com")
call append(3,"# Last modified: " . strftime("%Y-%m-%d %H:%M"))
call append(4,"# Filename: " . expand("%:t"))
call append(5,"# Description: ")
call append(6,"=============================================================================*/")
echohl WarningMsg | echo "Successful in adding the copyright." | echohl None
endf

function UpdateTitle()
normal m'
execute '/# *Last modified:/s@:.*\=strftime(":\t%Y-%m-%d %H:%M")@'
normal ''
normal mk
execute '/# *Filename:/s@:.*\=":\t\t".expand("%:t")@'
execute "noh"
normal 'k
echohl WarningMsg | echo "Successful in updating the copy right." | echohl None
endfunction

function TitleDet()
let n=1
while n < 7
let line = getline(n)
if line =~ '^\#\s*\S*Last\smodified:\S*.*$'
call UpdateTitle()
return
endif
let n = n + 1
endwhile

call AddTitle()
endfunction
上面代码中的append函数的第一个参数是在指定的行后面插入内容,这里从第一行后面开始插入(第一行留给"<?php")。 
 
小贴士:如果上面的代码粘贴到vim中格式乱了,可以使用shell中输入"cat <<END>> ~/.vimrc"回车,再粘贴代码,再输入字符"END",完成追加代码到文件。
 

2、 快速添加版权信息测试:

  按上面要求修改~/.vimrc文件并保存后,使用vim随便打开一个php文件,按F4,恭喜,神奇的一幕发生了。

PHP php://memory、php://temp流用法解析

PHPliuliangsong 发表了文章 • 0 个评论 • 338 次浏览 • 2016-12-06 12:42 • 来自相关话题

一、php://memory流介绍:  php://memory流类似如一个文件,支持读写操作;使用fopen()、fclose()函数打开流,使用fseek()、rewind()函数移动流指针, 使用ftell()、feof() 函数获取流指针当前的位置。
  与普通文件不同的是,php://memory流的数据是写在内存中,速度比普通文件快很多。不过由于直接占用内存,不建议将大数据写入此流。php://memory流适合用于存放需要多次重复、频繁使用,数据量不大的临时内容。
内存填充测试:<?php
echo sprintf("填充前内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
$mem = fopen('php://memory', 'r+');
for($i=0; $i<10000; $i++) {
fwrite($mem, str_repeat('aiezu.com', 1000));
}
echo sprintf("填充后内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
fclose($mem);
echo sprintf("内存释放后占用: %.2fMB\n", memory_get_usage()/1024/1024);测试结果:[root@aiezu.com ~]# php test.php
填充前内存占用: 0.21MB
填充后内存占用: 86.05MB
内存释放后占用: 0.21MB  二、php://temp流介绍:  php://temp流与php://memory流用法和功能基本相同,只是默认当写入的数据达到2MB时,数据将由写入在内存变为写入到临时文件。写入的临时文件名为sys_get_temp_dir()函数获取的目录下以"php"开头的随机文件名;可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据才写入到临时文件;php://temp流比较适合用于存放数据量比较大,且需要重复读取的数据。
  下面是通过linux curl上传csv的简单的例子,用于演示php://temp的用法;由于此例未重复使用这些csv数据,只做演示用,实际应用中此例完全可以去掉使用php://temp流。
网站端test.php代码:<?php
//设置编码,不然中文会乱码
setlocale(LC_ALL, array('zh_CN.UTF-8', 'zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));
if ( strtolower($_SERVER['CONTENT_TYPE']) == "application/csv" ) {
$input = fopen("php://input", 'r');
$temp = fopen("php://temp/maxmemory:0", 'r+');
while( $buffer = fread($input, 1024) ) {
fwrite($temp, $buffer);
}
fclose($input);
rewind($temp); //指针移动到文件头

fgetcsv($temp); //跳过标题行
while($data = fgetcsv($temp)) {
print_r($data);
//将数据写入数据库或者其他复杂计算操作
//...
}
}客户端site.csv数据:站点,url,行业
天猫,tmall.com,电子商务
腾讯,qq.com,社交网络
新浪,sina.com.cn,门户
...linux curl上传csv数据命令:[root@aiezu.com ~]# curl -H "Content-Type: application/csv" --data-binary @site.csv http://aiezu.com/test.php
Array
(
[0] => 天猫
[1] => tmall.com
[2] => 电子商务
)
Array
(
[0] => 腾讯
[1] => qq.com
[2] => 社交网络
)
Array
(
[0] => 新浪
[1] => sina.com.cn
[2] => 门户
)
... 三、附录:PHP 输入输出流合集 查看全部

一、php://memory流介绍:

  php://memory流类似如一个文件,支持读写操作;使用fopen()、fclose()函数打开流,使用fseek()、rewind()函数移动流指针, 使用ftell()、feof() 函数获取流指针当前的位置。
  与普通文件不同的是,php://memory流的数据是写在内存中,速度比普通文件快很多。不过由于直接占用内存,不建议将大数据写入此流。php://memory流适合用于存放需要多次重复、频繁使用,数据量不大的临时内容。
内存填充测试:
<?php
echo sprintf("填充前内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
$mem = fopen('php://memory', 'r+');
for($i=0; $i<10000; $i++) {
fwrite($mem, str_repeat('aiezu.com', 1000));
}
echo sprintf("填充后内存占用: %.2fMB\n", memory_get_usage()/1024/1024);
fclose($mem);
echo sprintf("内存释放后占用: %.2fMB\n", memory_get_usage()/1024/1024);
测试结果:
[root@aiezu.com ~]# php test.php
填充前内存占用: 0.21MB
填充后内存占用: 86.05MB
内存释放后占用: 0.21MB
  

二、php://temp流介绍:

  php://temp流与php://memory流用法和功能基本相同,只是默认当写入的数据达到2MB时,数据将由写入在内存变为写入到临时文件。写入的临时文件名为sys_get_temp_dir()函数获取的目录下以"php"开头的随机文件名;可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据才写入到临时文件;php://temp流比较适合用于存放数据量比较大,且需要重复读取的数据。
  下面是通过linux curl上传csv的简单的例子,用于演示php://temp的用法;由于此例未重复使用这些csv数据,只做演示用,实际应用中此例完全可以去掉使用php://temp流。
网站端test.php代码:
<?php
//设置编码,不然中文会乱码
setlocale(LC_ALL, array('zh_CN.UTF-8', 'zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));
if ( strtolower($_SERVER['CONTENT_TYPE']) == "application/csv" ) {
$input = fopen("php://input", 'r');
$temp = fopen("php://temp/maxmemory:0", 'r+');
while( $buffer = fread($input, 1024) ) {
fwrite($temp, $buffer);
}
fclose($input);
rewind($temp); //指针移动到文件头

fgetcsv($temp); //跳过标题行
while($data = fgetcsv($temp)) {
print_r($data);
//将数据写入数据库或者其他复杂计算操作
//...
}
}
客户端site.csv数据:
站点,url,行业
天猫,tmall.com,电子商务
腾讯,qq.com,社交网络
新浪,sina.com.cn,门户
...
linux curl上传csv数据命令:
[root@aiezu.com ~]# curl -H "Content-Type: application/csv" --data-binary @site.csv http://aiezu.com/test.php 
Array
(
[0] => 天猫
[1] => tmall.com
[2] => 电子商务
)
Array
(
[0] => 腾讯
[1] => qq.com
[2] => 社交网络
)
Array
(
[0] => 新浪
[1] => sina.com.cn
[2] => 门户
)
...
 

三、附录:

PHP 输入输出流合集

PHPliuliangsong 发表了文章 • 0 个评论 • 259 次浏览 • 2016-12-05 13:58 • 来自相关话题

  PHP 提供了输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。流接口常量介绍php://stdinSTDIN只读,用于CLI模式从命令行读取内容;php://stdoutSTDOUT只写,用于CLI模式向命令行标准输出输出内容;php://stderrSTDERR只写,用于CLI模式向命令行错误输出输出内容;php://input无只读,用于HTTP模式读取客户端以POST方式提交,
HTTP请求头Content-Type值不为multipart/form-data​的数据;php://output无只写,输出内容,近似echo、print的功能;php://memory无读写,类似文件包装器的数据流,用于内存中读写临时数据;php://temp无同上,不过当数据多于2MB会被写入到临时文件;
可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据写入到临时文件;
临时文件位置与sys_get_temp_dir()一致;php://fd无允许直接访问指定的文件描述符;
如“php://fd/3”引用了文件描述符“3”;php://filter无是一种元封装器,用于数据流打开时的筛选和过滤应用。这对于一体式的文件函数非常有用,类似readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他。官方介绍文档:http://php.net/manual/zh/wrappers.php.php 查看全部
  PHP 提供了输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
流接口常量介绍
php://stdinSTDIN只读,用于CLI模式从命令行读取内容;
php://stdoutSTDOUT只写,用于CLI模式向命令行标准输出输出内容;
php://stderrSTDERR只写,用于CLI模式向命令行错误输出输出内容;
php://input只读,用于HTTP模式读取客户端以POST方式提交,
HTTP请求头Content-Type值不为multipart/form-data​的数据;
php://output只写,输出内容,近似echo、print的功能;
php://memory读写,类似文件包装器的数据流,用于内存中读写临时数据;
php://temp同上,不过当数据多于2MB会被写入到临时文件;
可以使用"php://temp/maxmemory:NN"形式设定超过NN字节时数据写入到临时文件;
临时文件位置与sys_get_temp_dir()一致;
php://fd允许直接访问指定的文件描述符;
如“php://fd/3”引用了文件描述符“3”;
php://filter是一种元封装器,用于数据流打开时的筛选和过滤应用。这对于一体式的文件函数非常有用,类似readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他。
官方介绍文档:http://php.net/manual/zh/wrappers.php.php

PHP php://input、php://output用法解析

PHPliuliangsong 发表了文章 • 0 个评论 • 588 次浏览 • 2016-12-05 10:28 • 来自相关话题

一、php://output输出流用法:  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   1、CLI模式通过php://output向终端输出内容:test.php文件:<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);输出:[root@aiezu.com ~]# php test.php
爱E族 2、Http模式通过php://output导出csv文件:  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");网页打开效果如下:



   二、php://input输入流用法:  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 1、PHP使用"php://input"接收XML数据:http test.php页面代码:<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}待提交xml.xml文件内容:<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>通过linux curl命令提交xml.xml:[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)  2、PHP使用"php://input"接收JSON数据:  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“六”节。
 3、PHP使用"php://input"接收文件内容:  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}提交测试:[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08
 三、附录:Linux curl命令详解PHP 输入、输出流合集 查看全部

一、php://output输出流用法:

  php://output是php语言中一个只写的数据流,向“php://input”写入的数据将像 print() 和 echo() 一样的方式 写入到输出缓冲区;“php://input”支持CLI(command-line interface,命令行界面)模式和Http模式;
   

1、CLI模式通过php://output向终端输出内容:

test.php文件:
<?php
$output = fopen("php://output", "w");
fwrite($output, "爱E族");
fclose($output);
输出:
[root@aiezu.com ~]# php test.php 
爱E族
 

2、Http模式通过php://output导出csv文件:

  注意,以UTF8编码导出CSV文件,如果文件头未添加BOM头,使用Excel打开会出现乱码。
test.php页面代码:
<?php
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="test.csv"');
$output = fopen('php://output','w') or die("Can't open php://output");
//UTF8 csv文件头前需添加BOM,不然会是乱码
fwrite($output, chr(0xEF).chr(0xBB).chr(0xBF));
// 输出标题行
fputcsv($output, array('站点名', '域名', '行业'));
//数据内容
$rows = array(
array('天猫', 'http://tmall.com', '电子商务')
,array('爱E族', 'http://aiezu.com', '互联网技术')
,array('腾讯', 'http://qq.com', '社交网络')
);
foreach($rows as $row) {
fputcsv($output, $row);
}
fclose($output) or die("Can't close php://output");
网页打开效果如下:
php_output流到处CSV文件.png

   

二、php://input输入流用法:

  php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data​"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
 

1、PHP使用"php://input"接收XML数据:

http test.php页面代码:
<?php
/**
* xml文档转为数组元素
* @param obj $xmlobject XML文档对象
* @return array
*/
function xmlToArray($xmlobject) {
$data = array();
foreach ((array)$xmlobject as $key => $value) {
$data[$key] = !is_string($value) ? xmlToArray($value) : $value;
}
return $data;
}

if ( strtolower($_SERVER['CONTENT_TYPE']) == 'application/xml' && $content = file_get_contents("php://input") ) {
$xml = simplexml_load_string($content);//转换post数据为simplexml对象
print_r(xmlToArray($xml));
}
待提交xml.xml文件内容:
<?xml version='1.0' encoding='UTF-8'?>
<root>
<site>
<name>爱E族</name>
<domain>aiezu.com</domain>
</site>
<site>
<name>天猫</name>
<domain>tmall.com</domain>
</site>
</root>
通过linux curl命令提交xml.xml:
[root@aiezu.com ~]# curl -H "Content-Type: application/xml" --data-binary @xml.xml http://aiezu.com/test.php
Array
(
[site] => Array
(
[0] => Array
(
[name] => 爱E族
[domain] => aiezu.com
)
[1] => Array
(
[name] => 天猫
[domain] => tmall.com
)
)
)
  

2、PHP使用"php://input"接收JSON数据:

  PHP使用"php://input"接收JSON数据,与接收XML数据十分类似,这里不再做介绍,要查看实例请参考:Linux curl命令get/post提交数据、json和文件全攻略 页面的第“”节。
 

3、PHP使用"php://input"接收文件内容:

  下面通过代码演示PHP使用"php://input"接收一个png文件,这里只是用于演示,实际运用中还是建议使用Http请求头"Content-Type"值为"multipart/form-data"的表单方式POST。
接收页面"test.php"代码:
<?php
if ( preg_match("#^image/(png|jpe?g|gif)$#i", $_SERVER['CONTENT_TYPE'], $match) && $binary = file_get_contents("php://input") ) {
$file = sprintf("/tmp/pic.%s", strtolower($match[1]));
file_put_contents($file, $binary);
echo sprintf("文件大小: %s\n", filesize($file));
echo sprintf("修改时间: %s\n", date("Y-m-d H:i:s", filemtime($file)));
}
提交测试:
[root@aiezu.com ~]# curl -H "Content-Type: image/png" --data-binary @logo.png http://aiezu.com/test.php
文件大小: 3706
修改时间: 2016-12-05 13:29:08

 三、附录:

PHP命令行输入输出流STDIN/STDOUT/STDERR用法

PHPliuliangsong 发表了文章 • 0 个评论 • 708 次浏览 • 2016-12-04 21:27 • 来自相关话题

一、PHP STDIN、STDOUT、STDERR简介:  STDIN、STDOUT、STDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作;

  它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。而它们的打开副本php://stdin、php://stdout、php://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。

STDIN/STDOUT/STDERR简介:原始流流打开副本描述STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息;STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息;  官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器“php://stdin”、 “php://stdout” 和 “php://stderr”。下面我们代码演示它们的用法。
  二、PHP STDIN用法:  PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()函数打开“php://stdin”,脚本将会等待用户输入内容,直到用户按下回车键提交。
测试脚本test.php内容:<?php
echo "请输出站点名称: ";
$name = fgets(STDIN);
echo sprintf("输入的站点名称为: %s\n", $name);

$stdin = fopen('php://stdin', 'r');
echo "请输出域名: ";
$domain = fread($stdin, 128); //最多读取128个字符
echo sprintf("输入的域名为: %s\n", $domain);
fclose($stdin);运行结果:[root@aiezu.com ~]# php test.php
请输出站点名称: 爱E族
输入的站点名称为: 爱E族

请输出域名: aiezu.com
输入的域名为: aiezu.com 三、PHP STDOUT用法:  PHP语言中"STDOUT"用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的"php://stdout"写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。
测试脚本test.php内容:<?php
fwrite(STDOUT, "我是通过STDOUT写入;\n");

$stdout = fopen("php://stdout", "w");
fwrite($stdout, "我是通过php://stdout写入;");
fclose($stdout);运行结果:[root@aiezu.com ~]# php test.php 1> test.out
[root@aiezu.com ~]# cat test.out
我是通过STDOUT写入;
我是通过php://stdout写入; 四、PHP STDERR用法:  PHP语言中"STDERR"用于向控制台输出错误信息;向此常量、或者向fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。
测试脚本test.php内容:<?php
fwrite(STDERR, "STDERR写入的错误输出;\n");

fwrite(STDOUT, "STDOUT写入的正常输出;\n");

$stderr = fopen("php://stdout", "w");
fwrite($stderr, "php://stderr写入的错误输出;\n");
fclose($stderr);正常输出和错误输出分别定向到不同文件:[root@aiezu.com ~]# php test.php 1>test.ok 2>test.err
[root@aiezu.com ~]# cat test.ok
STDOUT写入的正常输出;
php://stderr写入的错误输出;
[root@aiezu tmp]# cat test.err
STDERR写入的错误输出;正常输出和错误输出合并定向到统一文件:[root@aiezu.com ~]# php test.php 1>AllInOne 2>&1
[root@aiezu.com ~]# cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出;
php://stderr写入的错误输出;   四、附录:PHP 输入、输出流合集 查看全部

一、PHP STDIN、STDOUT、STDERR简介:

  STDINSTDOUTSTDERR命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作;

  它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。而它们的打开副本php://stdinphp://stdoutphp://stderr 也无法输出内容到http浏览器,经测试:写入php://stderr的内容将会输入到默认站点的错误日志中,其它两种无任何效果。

STDIN/STDOUT/STDERR简介:
原始流流打开副本描述
STDINphp://stdin标准输入(standard input),只读,用于从控制台输入内容;
STDOUTphp://stdout标准输出(standard output),只写,用于向控制台输出正常信息
STDERRphp://stderr错误输出(standard error),只写,用于向控制台输出错误信息
  官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器“php://stdin”、 “php://stdout” 和 “php://stderr”。下面我们代码演示它们的用法。
  

二、PHP STDIN用法:

  PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()函数打开“php://stdin”,脚本将会等待用户输入内容,直到用户按下回车键提交。
测试脚本test.php内容:
<?php
echo "请输出站点名称: ";
$name = fgets(STDIN);
echo sprintf("输入的站点名称为: %s\n", $name);

$stdin = fopen('php://stdin', 'r');
echo "请输出域名: ";
$domain = fread($stdin, 128); //最多读取128个字符
echo sprintf("输入的域名为: %s\n", $domain);
fclose($stdin);
运行结果:
[root@aiezu.com ~]# php test.php 
请输出站点名称: 爱E族
输入的站点名称为: 爱E族

请输出域名: aiezu.com
输入的域名为: aiezu.com
 

三、PHP STDOUT用法:

  PHP语言中"STDOUT"用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的"php://stdout"写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。
测试脚本test.php内容:
<?php
fwrite(STDOUT, "我是通过STDOUT写入;\n");

$stdout = fopen("php://stdout", "w");
fwrite($stdout, "我是通过php://stdout写入;");
fclose($stdout);
运行结果:
[root@aiezu.com ~]# php test.php 1> test.out
[root@aiezu.com ~]# cat test.out
我是通过STDOUT写入;
我是通过php://stdout写入;
 

四、PHP STDERR用法:

  PHP语言中"STDERR"用于向控制台输出错误信息;向此常量、或者向fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。
测试脚本test.php内容:
<?php
fwrite(STDERR, "STDERR写入的错误输出;\n");

fwrite(STDOUT, "STDOUT写入的正常输出;\n");

$stderr = fopen("php://stdout", "w");
fwrite($stderr, "php://stderr写入的错误输出;\n");
fclose($stderr);
正常输出和错误输出分别定向到不同文件:
[root@aiezu.com ~]# php test.php 1>test.ok 2>test.err
[root@aiezu.com ~]# cat test.ok
STDOUT写入的正常输出;
php://stderr写入的错误输出;
[root@aiezu tmp]# cat test.err
STDERR写入的错误输出;
正常输出和错误输出合并定向到统一文件:
[root@aiezu.com ~]# php test.php 1>AllInOne 2>&1
[root@aiezu.com ~]# cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出;
php://stderr写入的错误输出;
  

 四、附录:

CentOS使用Yum为PHP安装Xdebug调试神器

PHPlinyu520 发表了文章 • 0 个评论 • 729 次浏览 • 2016-11-17 22:10 • 来自相关话题

一、实验环境:操作系统:CentOS Linux release 7.2.1511 (Core)PHP版本:PHP 5.4.16 (cli) ,Yum方式安装Xdebug版本:2.2.7-1.el7 
  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace(); 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:选项名类型默认值参数选项描述xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录xdebug.profiler_output_namestringcachegrind.out.%p

 指定性能分析信息文件的名称xdebug.remote_enablebooleanOff是否开启远程调试xdebug.remote_handlerstringdbgp指定远程调试的处理协议xdebug.remote_hoststringlocalhost指定远程调试的主机名xdebug.remote_logstring 指定远程调试的日志文件名xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。xdebug.remote_portinteger9000指定远程调试的端口号xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录xdebug.trace_output_namestringtrace.%c指定追踪文件的名称xdebug.show_exception_tracebooleanOff是否开启异常跟踪xdebug.show_mem_deltabooleanOff是否追踪内存的变化xdebug.show_local_varsbooleanOff是否显示局部变量  查看全部
一、实验环境:
  • 操作系统:CentOS Linux release 7.2.1511 (Core)
  • PHP版本:PHP 5.4.16 (cli) ,Yum方式安装
  • Xdebug版本:2.2.7-1.el7 

  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:
[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug
安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:
[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug
 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。
; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H
注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:
<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace();
 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:
选项名类型默认值参数选项描述
xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。
xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。
xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。
xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。
xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。
xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。
xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。
xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。
xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。
xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*
xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。
xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。
xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。
xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。
xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。
xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。
xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。
xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。
xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。
xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。
xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。
xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。
xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。
xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。
xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录
xdebug.profiler_output_namestringcachegrind.out.%p

 
指定性能分析信息文件的名称
xdebug.remote_enablebooleanOff是否开启远程调试
xdebug.remote_handlerstringdbgp指定远程调试的处理协议
xdebug.remote_hoststringlocalhost指定远程调试的主机名
xdebug.remote_logstring 指定远程调试的日志文件名
xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。
xdebug.remote_portinteger9000指定远程调试的端口号
xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。
xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录
xdebug.trace_output_namestringtrace.%c指定追踪文件的名称
xdebug.show_exception_tracebooleanOff是否开启异常跟踪
xdebug.show_mem_deltabooleanOff是否追踪内存的变化
xdebug.show_local_varsbooleanOff是否显示局部变量 

PHP魔术方法合集

PHPlinyu520 发表了文章 • 0 个评论 • 197 次浏览 • 2016-11-17 13:28 • 来自相关话题

  PHP 将所有以“__”(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以“__”为前缀。魔术方法描述__construct()初始化一个对象时触发;__destruct()对象销毁,或者脚本执行完时触发;__autoload()当使用一个不可访问的类时触发;__clone()对象被克隆时触发;__get()获取一个不可访问(属性不存在、或者无权限)的属性时触发;__set()为一个不可访问的属性赋值的时候触发;__isset()当用isset()函数判断一个不可访问的属性时触发;__unset()当用unset()函数操作一个不可访问的属性时触发;__call()当调用一个不可访问的方法时触发;__callStatic()当调用一个不可访问的静态方法时触发;__toString()当一个对象被当做字符串来操作时触发;
如$obj是一个对象,echo $obj,就会触发__toString();__invoke()当一个对象被当做函数来使用时触发;
如$obj是一个对象,$obj()就会触发__invoke();__sleep()在将使用serialize时触发;__wakeup()在使用unserialize后触发;__set_state()当调用var_export()导出类时触发(PHP 5.1.0起);__debugInfo() 当调用var_dump()导出一个对象时调用(PHP 5.6.0起); 
用法演示:
1、__autoload()魔术方法:
__autoload()是我们最为常用的魔术方法,常常用于自定加载类文件,做到按需加载:<?php
//爱E族 aiezu.com
function __autoload($class) {
if (class_exists($class, false)) return;
$file = sprintf("./class/%s.php", str_replace('_', DIRECTORY_SEPARATOR, $class));
require_once($file);
}
// 当类Core_Db不存在时,自动引入类文件:./class/Core/Db.php
$db = new Core_Db(); 
2、__debugInfo()魔术方法:
<?php
class Aiezu {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function __debugInfo() {
return array('SiteName'=> $this->name);
}
}
var_dump(new Aiezu('爱E族'));​PHP 5.6.0以下版本运行结果:object(Aiezu)#1 (1) {
["name":"Aiezu":private]=>
string(7) "爱E族"
}PHP 5.6.0以上版本运行结果:object(Aiezu)#1 (1) {
["SiteName"]=>
string(7) "爱E族"

3、__sleep()魔术方法:<?php
class Aiezu {
private $name;
private $url = 'aiezu.com';
public function __construct($name) {
$this->name = $name;
}
public function __sleep() {
return array('url'); //指定要序列化的属性列表
}
}
echo serialize(new Aiezu('爱E族'));输出:O:5:"Aiezu":1:{s:10:"Aiezuurl";s:9:"aiezu.com";} 查看全部
  PHP 将所有以“__”(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以“__”为前缀。
魔术方法描述
__construct()初始化一个对象时触发;
__destruct()对象销毁,或者脚本执行完时触发;
__autoload()当使用一个不可访问的类时触发;
__clone()对象被克隆时触发;
__get()获取一个不可访问(属性不存在、或者无权限)的属性时触发;
__set()为一个不可访问的属性赋值的时候触发;
__isset()当用isset()函数判断一个不可访问的属性时触发;
__unset()当用unset()函数操作一个不可访问的属性时触发;
__call()当调用一个不可访问的方法时触发;
__callStatic()当调用一个不可访问的静态方法时触发;
__toString()当一个对象被当做字符串来操作时触发;
如$obj是一个对象,echo $obj,就会触发__toString();
__invoke()当一个对象被当做函数来使用时触发;
如$obj是一个对象,$obj()就会触发__invoke();
__sleep()在将使用serialize时触发;
__wakeup()在使用unserialize后触发;
__set_state()当调用var_export()导出类时触发(PHP 5.1.0起);
__debugInfo() 当调用var_dump()导出一个对象时调用(PHP 5.6.0起);
 
用法演示:
1、__autoload()魔术方法:
__autoload()是我们最为常用的魔术方法,常常用于自定加载类文件,做到按需加载:
<?php
//爱E族 aiezu.com
function __autoload($class) {
if (class_exists($class, false)) return;
$file = sprintf("./class/%s.php", str_replace('_', DIRECTORY_SEPARATOR, $class));
require_once($file);
}
// 当类Core_Db不存在时,自动引入类文件:./class/Core/Db.php
$db = new Core_Db();
 
2、__debugInfo()魔术方法:
<?php
class Aiezu {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function __debugInfo() {
return array('SiteName'=> $this->name);
}
}
var_dump(new Aiezu('爱E族'));
​PHP 5.6.0以下版本运行结果:
object(Aiezu)#1 (1) {
["name":"Aiezu":private]=>
string(7) "爱E族"
}
PHP 5.6.0以上版本运行结果:
object(Aiezu)#1 (1) {
["SiteName"]=>
string(7) "爱E族"
}
 
3、__sleep()魔术方法:
<?php
class Aiezu {
private $name;
private $url = 'aiezu.com';
public function __construct($name) {
$this->name = $name;
}
public function __sleep() {
return array('url'); //指定要序列化的属性列表
}
}
echo serialize(new Aiezu('爱E族'));
输出:
O:5:"Aiezu":1:{s:10:"Aiezuurl";s:9:"aiezu.com";}