国内iphone ios app store审核ipv6被拒解决方案(IPv6隧道方式)

Objective-Cliuliangsong 发表了文章 • 0 个评论 • 28 次浏览 • 10 小时前 • 来自相关话题

  由于苹果的应用审核策略升级,自2016年6月1日起,提交新版本的APP需要支持IPV6-Only的网络才能通过审核。而目前国内99%的网络不支持IPV6,甚至国内最大的云平台阿里云,由于无可用IPV6网络,干脆禁用了云服务器的IPV6模块,可见苹果给国内开发者扔下一个大大的难题。
  下面以CentOS 7.2为例,通过ipv6通道的方式,解决ios ipv6审核拒解的难题。
  一、开启服务器的IPV6模块(阿里云):  由于阿里云禁用了云服务器ECS的IPV6模块,所有我们需要先开启它:
1、修改/etc/sysctl.conf中ipv6的配置,将下面三行值设置为0,如下所示:net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0  
2、注释掉/etc/modprobe.d/disable_ipv6.conf文件中的内容,或者直接删除此文件。#alias net-pf-10 off
#options ipv6 disable=0  
3、修改/etc/sysconfig/network中的配置项NETWORKING_IPV6值为YES:NETWORKING_IPV6=yes  
4、重启服务器,查看IPV6模块是否开启成功:init 6ifconfig |grep inet6  二、创建IPV6隧道:  这里使用免费又好用的网站https://www.tunnelbroker.net/来创建IPV6隧道,创建前需免费注册账号,创建完账号后,开始执行下面操作:
1、创建隧道:点击“Create Regular Tunnel”,进入”Create New Tunnel“页面;输入你的web服务器的公网IP地址,并选择合适的隧道服务器地址,选择之前最好先对服务器ip进行ping测试,选择丢包率和延迟较小的服务器来创建,这直接决定你将来通过审核的成功率,我这里选择的是香港(Hong Kong, HK);点击”Create Tunnel“完成创建。
  
2、创建完成后,点击"Example Configurations"选项卡,在下拉菜单中选择”Linux-net-tools“,然后复制代码,在web服务器中执行:


执行完成后,输出ifconfig命令,即可查看到创建隧道后,本地服务器的ipv6地址:



 
3、至此,web服务器已经通过隧道的方式接入到IPV6网络了,可以使用ping6命令进行测试: ping6 ipv6.baidu.com
ping6 ipv6.google.com  三、开启Web服务的IPV6支持:1、apache修改配置文件,将Listen行修改为如下(vim /etc/httpd/conf/httpd.conf):Listen [::]:80  
2、nginx修改配置文件,将Listen行修改为如下:listen [::]:80;  四、添加域名的IPV6记录( aaaa记录):  在域名注册商网站,登录到域名管理后台,添加一条aaaa记录,记录名与ipv4名相同,记录值为上面web服务器的IPV6地址"2001:470:35:7ea::2"。如域名商不支持aaaa记录,可以将NS服务修改为DNSPOD的NS服务器,到dnspod上去进行添加。
  五、在线测试网站的IPV6支持:  打开网站http://ipv6-test.com/validate.php,输入域名进行测试,如前面两项校验通过,即可将app提交审核啦,欢迎留言交流。 查看全部
  由于苹果的应用审核策略升级,自2016年6月1日起,提交新版本的APP需要支持IPV6-Only的网络才能通过审核。而目前国内99%的网络不支持IPV6,甚至国内最大的云平台阿里云,由于无可用IPV6网络,干脆禁用了云服务器的IPV6模块,可见苹果给国内开发者扔下一个大大的难题。
  下面以CentOS 7.2为例,通过ipv6通道的方式,解决ios ipv6审核拒解的难题。
  

一、开启服务器的IPV6模块(阿里云):

  由于阿里云禁用了云服务器ECS的IPV6模块,所有我们需要先开启它:
1、修改/etc/sysctl.conf中ipv6的配置,将下面三行值设置为0,如下所示:
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
  
2、注释掉/etc/modprobe.d/disable_ipv6.conf文件中的内容,或者直接删除此文件。
#alias net-pf-10 off
#options ipv6 disable=0
  
3、修改/etc/sysconfig/network中的配置项NETWORKING_IPV6值为YES:
NETWORKING_IPV6=yes
  
4、重启服务器,查看IPV6模块是否开启成功:
init 6
ifconfig |grep inet6
  

二、创建IPV6隧道:

  这里使用免费又好用的网站https://www.tunnelbroker.net/来创建IPV6隧道,创建前需免费注册账号,创建完账号后,开始执行下面操作:
1、创建隧道:
  1. 点击“Create Regular Tunnel”,进入”Create New Tunnel“页面;
  2. 输入你的web服务器的公网IP地址,并选择合适的隧道服务器地址,选择之前最好先对服务器ip进行ping测试,选择丢包率和延迟较小的服务器来创建,这直接决定你将来通过审核的成功率,我这里选择的是香港(Hong Kong, HK);
  3. 点击”Create Tunnel“完成创建。

  
2、创建完成后,点击"Example Configurations"选项卡,在下拉菜单中选择”Linux-net-tools“,然后复制代码,在web服务器中执行:
详解通过ipv6隧道的方式解决ios_ipv6审核被拒.png
执行完成后,输出ifconfig命令,即可查看到创建隧道后,本地服务器的ipv6地址:
详解通过ipv6隧道的方式解决ios_ipv6审核被拒_02.png

 
3、至此,web服务器已经通过隧道的方式接入到IPV6网络了,可以使用ping6命令进行测试: 
ping6 ipv6.baidu.com
ping6 ipv6.google.com
  

三、开启Web服务的IPV6支持:

1、apache修改配置文件,将Listen行修改为如下(vim /etc/httpd/conf/httpd.conf):
Listen [::]:80
  
2、nginx修改配置文件,将Listen行修改为如下:
listen       [::]:80;
  

四、添加域名的IPV6记录( aaaa记录):

  在域名注册商网站,登录到域名管理后台,添加一条aaaa记录,记录名与ipv4名相同,记录值为上面web服务器的IPV6地址"2001:470:35:7ea::2"。如域名商不支持aaaa记录,可以将NS服务修改为DNSPOD的NS服务器,到dnspod上去进行添加。
  

五、在线测试网站的IPV6支持:

  打开网站http://ipv6-test.com/validate.php,输入域名进行测试,如前面两项校验通过,即可将app提交审核啦,欢迎留言交流。

PHP curl curl_setopt()函数选项合集

PHPllslx520 发表了文章 • 0 个评论 • 137 次浏览 • 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 个评论 • 121 次浏览 • 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 个评论 • 197 次浏览 • 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 个评论 • 318 次浏览 • 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,恭喜,神奇的一幕发生了。

Chrome图片上传字段弹出图片选择框十分慢

回复

Javascriptllslx520 回复了问题 • 1 人关注 • 1 个回复 • 401 次浏览 • 2017-03-08 18:08 • 来自相关话题

Golang(go语言)中map创建/赋值/读取

GoLangliuliangsong 发表了文章 • 0 个评论 • 324 次浏览 • 2016-12-10 22:53 • 来自相关话题

  go语言map是一种无序的键值对的集合。map最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
 一、golang map声明、初始化、赋值、使用Println输出:package main
import "fmt"
func main() {
// 声明map
var m map[int]string
// 初始化map, 未初始化的map为nil map,不能赋值
m = make(map[int]string)
// 赋值
m[1] = "aaa"
m[2] = "bbb"
m[3] = "999"
// 输出
fmt.Println(m)
}运行结果:[root@aiezu.com ~]# go run test.go
map[1:aaa 2:bbb 3:999]  二、golang直接初始化创建map、然后赋值、使用for输出:package main
import "fmt"
func main() {
// 直接初始化创建
m := make( map[string]string )
// 赋值
m["site"] = "aiezu.com"
m["name"] = "爱E族"
m["test"] = "123456"

// for 输出
for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}运行结果:[root@aiezu.com ~]# go run test.go
site aiezu.com
name 爱E族
test 123456  
三、go语言直接创建map并赋值,并使用for输出:package main
import "fmt"
func main() {
// 直接创建并赋值
m := map[string]string {
"name" : "爱e族",
"domain" : "aiezu.com",
}

for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}
运行结果:[root@aiezu.com ~]# go run test.go
name 爱e族
domain aiezu.com

  查看全部
  go语言map是一种无序的键值对的集合。map最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
 

一、golang map声明、初始化、赋值、使用Println输出:

package main
import "fmt"
func main() {
// 声明map
var m map[int]string
// 初始化map, 未初始化的map为nil map,不能赋值
m = make(map[int]string)
// 赋值
m[1] = "aaa"
m[2] = "bbb"
m[3] = "999"
// 输出
fmt.Println(m)
}
运行结果:
[root@aiezu.com ~]# go run test.go 
map[1:aaa 2:bbb 3:999]
  

二、golang直接初始化创建map、然后赋值、使用for输出:

package main
import "fmt"
func main() {
// 直接初始化创建
m := make( map[string]string )
// 赋值
m["site"] = "aiezu.com"
m["name"] = "爱E族"
m["test"] = "123456"

// for 输出
for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}
运行结果:
[root@aiezu.com ~]# go run test.go 
site aiezu.com
name 爱E族
test 123456
  
三、go语言直接创建map并赋值,并使用for输出:
package main
import "fmt"
func main() {
// 直接创建并赋值
m := map[string]string {
"name" : "爱e族",
"domain" : "aiezu.com",
}

for key, val := range m {
fmt.Print(key, "\t", val, "\n")
}
}
运行结果:
[root@aiezu.com ~]# go run test.go 
name 爱e族
domain aiezu.com

 

Golang(go语言)上传图片和显示图片

GoLangliuliangsong 发表了文章 • 0 个评论 • 493 次浏览 • 2016-12-09 17:53 • 来自相关话题

  下面是一段简单的Go语言代码,可以用来监听端口,实现简单的http图片上传,和显示上传的图片,可供初学者参考:package main;
import (
"fmt"
"io"
"io/ioutil"
"os"
"path"
"net/http"
"errors"
"strings"
)

func main() {
http.HandleFunc("/upload/", uploadHandle) // 上传
http.HandleFunc("/uploaded/", showPicHandle) //显示图片
err := http.ListenAndServe(":80", nil)
fmt.Println(err)
}

// 上传图像接口
func uploadHandle (w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")

req.ParseForm()
if req.Method != "POST" {
w.Write([]byte(html))
} else {
// 接收图片
uploadFile, handle, err := req.FormFile("image")
errorHandle(err, w)

// 检查图片后缀
ext := strings.ToLower(path.Ext(handle.Filename))
if ext != ".jpg" && ext != ".png" {
errorHandle(errors.New("只支持jpg/png图片上传"), w);
return
//defer os.Exit(2)
}

// 保存图片
os.Mkdir("./uploaded/", 0777)
saveFile, err := os.OpenFile("./uploaded/" + handle.Filename, os.O_WRONLY|os.O_CREATE, 0666);
errorHandle(err, w)
io.Copy(saveFile, uploadFile);

defer uploadFile.Close()
defer saveFile.Close()
// 上传图片成功
w.Write([]byte("查看上传图片: <a target='_blank' href='/uploaded/" + handle.Filename + "'>" + handle.Filename + "</a>"));
}
}

// 显示图片接口
func showPicHandle( w http.ResponseWriter, req *http.Request ) {
file, err := os.Open("." + req.URL.Path)
errorHandle(err, w);

defer file.Close()
buff, err := ioutil.ReadAll(file)
errorHandle(err, w);
w.Write(buff)
}

// 统一错误输出接口
func errorHandle(err error, w http.ResponseWriter) {
if err != nil {
w.Write([]byte(err.Error()))
}
}

const html = `<html>
<head></head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" />
</form>
</body>
</html>` 查看全部
  下面是一段简单的Go语言代码,可以用来监听端口,实现简单的http图片上传,和显示上传的图片,可供初学者参考:
package main;
import (
"fmt"
"io"
"io/ioutil"
"os"
"path"
"net/http"
"errors"
"strings"
)

func main() {
http.HandleFunc("/upload/", uploadHandle) // 上传
http.HandleFunc("/uploaded/", showPicHandle) //显示图片
err := http.ListenAndServe(":80", nil)
fmt.Println(err)
}

// 上传图像接口
func uploadHandle (w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")

req.ParseForm()
if req.Method != "POST" {
w.Write([]byte(html))
} else {
// 接收图片
uploadFile, handle, err := req.FormFile("image")
errorHandle(err, w)

// 检查图片后缀
ext := strings.ToLower(path.Ext(handle.Filename))
if ext != ".jpg" && ext != ".png" {
errorHandle(errors.New("只支持jpg/png图片上传"), w);
return
//defer os.Exit(2)
}

// 保存图片
os.Mkdir("./uploaded/", 0777)
saveFile, err := os.OpenFile("./uploaded/" + handle.Filename, os.O_WRONLY|os.O_CREATE, 0666);
errorHandle(err, w)
io.Copy(saveFile, uploadFile);

defer uploadFile.Close()
defer saveFile.Close()
// 上传图片成功
w.Write([]byte("查看上传图片: <a target='_blank' href='/uploaded/" + handle.Filename + "'>" + handle.Filename + "</a>"));
}
}

// 显示图片接口
func showPicHandle( w http.ResponseWriter, req *http.Request ) {
file, err := os.Open("." + req.URL.Path)
errorHandle(err, w);

defer file.Close()
buff, err := ioutil.ReadAll(file)
errorHandle(err, w);
w.Write(buff)
}

// 统一错误输出接口
func errorHandle(err error, w http.ResponseWriter) {
if err != nil {
w.Write([]byte(err.Error()))
}
}

const html = `<html>
<head></head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" />
</form>
</body>
</html>`

Linux vim为Golang(go语言)添加语法高亮

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

  Go语言是谷歌2009发布的一款开源跨平台编程语言,目前vim默认还没有为golang提供语法高亮功能,要实现go语言vim下语法高亮,可以参考下面设置。  一、测试环境:  我的测试环境为RHEL7.1,本文适用与CentOS、Ubuntu、Fedora,同样也适用于其他大多数linux系统: [root@aiezu.com ~]# cat /etc/redhat-release
Derived from Red Hat Enterprise Linux 7.1 (Source)
[root@aiezu.com ~]# uname -a
Linux aiezu.com 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 二、为vim添加go语言用法高亮:  打开https://golang.org/dl/页面,在上面找到并下载“go1.3.3.src.tar.gz ”源码包,然后解压:wget https://storage.googleapis.com/golang/go1.3.3.src.tar.gz
tar -zxvf go1.3.3.src.tar.gz  然后将解压出来的“go/misc/vim/”目录下的syntax、ftplugin、indent、compiler、ftdetect五个文件夹复制到"/usr/share/vim/vim74/"目录下:cp -R go/misc/vim/syntax/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftplugin/ /usr/share/vim/vim74/
cp -R go/misc/vim/indent/ /usr/share/vim/vim74/
cp -R go/misc/vim/compiler/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftdetect/ /usr/share/vim/vim74/ 三、测试:  文件全部复制好后,创建一个后缀为".go"的文件,输入golang代码试试,看vim golang语法高亮是否生效,我的效果如下:



 四、附录:  可以在用户目录下,添加一个".vimrc"文件,在文件添加一些vim初始设置项,来设置是否现在行号、tab字符宽度、文本缩进等。".vimrc"文件每次使用vim命令时都会自动调用。运行"vim ~/.vimrc"命令,然后添加如下内容:syntax on
"set number " 显示行号
"set cursorline " 突出显示当前行
set tabstop=4 " Tab键的宽度

" 统一缩进为4
set softtabstop=4
set shiftwidth=4 查看全部

  Go语言是谷歌2009发布的一款开源跨平台编程语言,目前vim默认还没有为golang提供语法高亮功能,要实现go语言vim下语法高亮,可以参考下面设置。

  

一、测试环境:

  我的测试环境为RHEL7.1,本文适用与CentOS、Ubuntu、Fedora,同样也适用于其他大多数linux系统: 
[root@aiezu.com ~]# cat /etc/redhat-release 
Derived from Red Hat Enterprise Linux 7.1 (Source)
[root@aiezu.com ~]# uname -a
Linux aiezu.com 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
 

二、为vim添加go语言用法高亮:

  打开https://golang.org/dl/页面,在上面找到并下载“go1.3.3.src.tar.gz ”源码包,然后解压:
wget https://storage.googleapis.com/golang/go1.3.3.src.tar.gz 
tar -zxvf go1.3.3.src.tar.gz
  然后将解压出来的“go/misc/vim/”目录下的syntax、ftplugin、indent、compiler、ftdetect五个文件夹复制到"/usr/share/vim/vim74/"目录下:
cp -R go/misc/vim/syntax/ /usr/share/vim/vim74/ 
cp -R go/misc/vim/ftplugin/ /usr/share/vim/vim74/
cp -R go/misc/vim/indent/ /usr/share/vim/vim74/
cp -R go/misc/vim/compiler/ /usr/share/vim/vim74/
cp -R go/misc/vim/ftdetect/ /usr/share/vim/vim74/
 

三、测试:

  文件全部复制好后,创建一个后缀为".go"的文件,输入golang代码试试,看vim golang语法高亮是否生效,我的效果如下:
vim_golang_syntax_highlight.png

 

四、附录:

  可以在用户目录下,添加一个".vimrc"文件,在文件添加一些vim初始设置项,来设置是否现在行号、tab字符宽度、文本缩进等。".vimrc"文件每次使用vim命令时都会自动调用。运行"vim ~/.vimrc"命令,然后添加如下内容:
syntax on
"set number " 显示行号
"set cursorline " 突出显示当前行
set tabstop=4 " Tab键的宽度

" 统一缩进为4
set softtabstop=4
set shiftwidth=4

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

PHPliuliangsong 发表了文章 • 0 个评论 • 351 次浏览 • 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] => 门户
)
...
 

三、附录: