标签归档:curl

CentOS 升级OpenSSL与CURL

#查看安装
rpm -qa | grep curl
curl-7.29.0-25.el7.centos.x86_64
libcurl-devel-7.29.0-25.el7.centos.x86_64
libcurl-7.29.0-25.el7.centos.x86_64

rpm -ql curl-7.29.0-25.el7.centos.x86_64
/usr/bin/curl

rpm -ql libcurl-7.29.0-25.el7.centos.x86_64
/usr/lib64/libcurl.so.4 -> libcurl.so.4.3.0
/usr/lib64/libcurl.so.4.3.0

rpm -ql libcurl-devel-7.29.0-25.el7.centos.x86_64
/usr/bin/curl-config
/usr/include/curl
/usr/include/curl/curl.h
/usr/include/curl/curlbuild-64.h
/usr/include/curl/curlbuild.h
/usr/include/curl/curlrules.h
/usr/include/curl/curlver.h
/usr/include/curl/easy.h
/usr/include/curl/mprintf.h
/usr/include/curl/multi.h
/usr/include/curl/stdcheaders.h
/usr/include/curl/typecheck-gcc.h
/usr/lib64/libcurl.so -> libcurl.so.4.3.0
/usr/lib64/pkgconfig/libcurl.pc
/usr/share/aclocal/libcurl.m4

#在Ubuntu下查看 默认使用OpenSSL
curl -V
curl 7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP

#在CentOS下查看 默认使用NSS
curl -V
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.19.1 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz

#CentOS中使用一个第三方源升级
#http://www.city-fan.org/ftp/contrib/yum-repo/有专门针对rhel的源
#wget www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-13.rhel6.noarch.rpm
wget www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-13.rhel7.noarch.rpm
rpm -Uvh city-fan.org-release-1-13.rhel7.noarch.rpm

yum repolist

yum update libcurl
======================================================================================================================================
 Package                                 Arch                  Version                              Repository                   Size
======================================================================================================================================
Updating:
 libcurl                                 x86_64                7.51.0-3.0.cf.rhel7                  city-fan.org                387 k
Installing for dependencies:
 libmetalink                             x86_64                0.1.3-1.rhel7                        city-fan.org                 25 k
 libnghttp2                              x86_64                1.7.1-1.el7                          epel                         61 k
 libpsl                                  x86_64                0.7.0-1.el7                          city-fan.org                 45 k
 libssh2-devel                           x86_64                1.8.0-1.0.cf.rhel7                   city-fan.org                 72 k
 nspr-devel                              x86_64                4.11.0-1.el7_2                       updates                     114 k
 nss-devel                               x86_64                3.21.0-9.el7_2                       updates                     211 k
 nss-softokn-devel                       x86_64                3.16.2.3-14.2.el7_2                  updates                      26 k
 nss-softokn-freebl-devel                x86_64                3.16.2.3-14.2.el7_2                  updates                      46 k
 nss-util-devel                          x86_64                3.21.0-2.2.el7_2                     updates                      71 k
Updating for dependencies:
 curl                                    x86_64                7.51.0-3.0.cf.rhel7                  city-fan.org                430 k
 libcurl-devel                           x86_64                7.51.0-3.0.cf.rhel7                  city-fan.org                793 k
 libssh2                                 x86_64                1.8.0-1.0.cf.rhel7                   city-fan.org                102 k

#在CentOS 7.x中升级后(多了nghttp2/1.7.1)
curl -V
curl 7.51.0 (x86_64-redhat-linux-gnu) libcurl/7.51.0 NSS/3.21 Basic ECC zlib/1.2.7 libpsl/0.7.0 (+libicu/50.1.2) libssh2/1.8.0 nghttp2/1.7.1
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets Metalink PSL

除了使用YUM来升级,也可以到官方下载RPM包(http://mirror.city-fan.org/ftp/contrib/sysutils/Mirroring/),比如:libcurl-7.51.0-3.0.cf.rhel7.x86_64.rpm:

rpm -Uvh libcurl-7.51.0-3.0.cf.rhel7.x86_64.rpm 
warning: libcurl-7.51.0-3.0.cf.rhel7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID b56a8bac: NOKEY
error: Failed dependencies:
	libnghttp2.so.14()(64bit) is needed by libcurl-7.51.0-3.0.cf.rhel7.x86_64
	libpsl.so.0()(64bit) is needed by libcurl-7.51.0-3.0.cf.rhel7.x86_64
	libssh2(x86-64) >= 1.8.0 is needed by libcurl-7.51.0-3.0.cf.rhel7.x86_64
	libcurl = 7.29.0-25.el7.centos is needed by (installed) curl-7.29.0-25.el7.centos.x86_64

直接使用RPM包安装,我们需要手动解决依赖,libnghttp2和libpsl在epel源中,直接yum安装就可以,不过libssh2版本就不符合要求了。

YUM或RPM包安装(CentOS系),默认使用NSS,这个东西类似OpenSSL,用来加密,对于HTTP来说就是提供HTTPS服务。如果需要用OpenSSL,那么就需要自己编译了:

cd curl-7.51.0/

./configure --without-nss --with-ssl && make &&make install

curl -V
curl 7.51.0 (x86_64-pc-linux-gnu) libcurl/7.51.0 OpenSSL/1.0.1e zlib/1.2.7 libssh2/1.8.0
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets

编译:

yum install zlib zlib-devel

###### OpenSSL
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz
tar zxvf openssl-1.0.2j.tar.gz
cd openssl-1.0.2j

#默认就是安装到/usr/local/ssl
./config --prefix=/usr/local/ssl shared zlib 
make && make install 

#配置库文件搜索路径
echo  "/usr/local/ssl/lib"  >>  /etc/ld.so.conf
ldconfig -v

#安全起见把这两个包拷贝进去
cp /usr/local/ssl/lib/libssl.so.1.0.0 /usr/lib64
cp /usr/local/ssl/lib/libcrypto.so.1.0.0 /usr/lib64/


###### Curl
wget https://curl.haxx.se/download/curl-7.51.0.tar.gz
tar zxvf curl-7.51.0.tar.gz
cd curl-7.51.0

#指定SSL安装类目
./configure --prefix=/usr/local/curl --without-nss --with-ssl=/usr/local/ssl
make && make install

#安装后配置(用自己安装的替换系统原来的)
mv /usr/bin/curl /usr/bin/curl.old
ln -s /usr/local/curl/bin/curl /usr/bin/curl

echo  "/usr/local/curl/lib"  >>  /etc/ld.so.conf
ldconfig -v

# 以下操作参考
#mv /usr/lib64/libcurl.so.4.4.0 /usr/lib64/libcurl.so.4.4.0.old
#ln -s /usr/local/curl/lib/libcurl.so.4.4.0 /usr/lib64/libcurl.so.4.4.0

PHP CURL应用实例

1 PHP CURL上传文件实例

/////////////////////////////////////////////////////
// http://zf.vfeelit.com/uploader/index.php
	if(!empty($_FILES['Filedata'])) {
		sleep(1);
		
		$tmpname = $_FILES['Filedata']['tmp_name'];
		$name = $_FILES['Filedata']['name'];
		
		if(is_uploaded_file($tmpname)) {
			move_uploaded_file($tmpname, 'D:/wamp/'.$name);
		}
		echo json_encode(array('success'=>'OK','file'=>$_FILES['Filedata']));
		exit;
	}


/////////////////////////////////////////////////////
$url = 'http://zf.vfeelit.com/uploader/index.php';


$filePath = 'D:\Users\gitlabadd-user';
$filetype = @getimagesize($filePath);
if(false !== $filetype){
	$mimeType = $filetype['mime'];
}else{
	$mimeType = mime_content_type($filePath);
}

// $_FILES['xxx']中xxx的名字
$useFileKey = 'Filedata'; 
if(version_compare(phpversion(), '5.5.0', '>=')){
	//第二 参数设置mime,第三参数设置postname
	$culFile = curl_file_create($filePath,$mimeType);
	$postFields = array($useFileKey=>$culFile);
}else{
	//1 < PHP 5.5.0 
	//$postFields = array($useFileKey=>"@$filePath");
	
	//2  
	$key = "$useFileKey\"; filename=\"$filePath\r\nContent-Type: $mimeType\r\n";
	$postFields[$key] = file_get_contents($filePath);;
}

//初始化
$ch = curl_init();

//参数设置
curl_setopt($ch, CURLOPT_HEADER, '');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
//
curl_setopt($ch, CURLOPT_POST, false);
//
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postFields);
//
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_MAXREDIRS,10);
//
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0");

//执行
$result = curl_exec($ch);
//是否产生了错误
$errn = curl_errno($ch);
//关闭
curl_close($ch);

/////////////////////////////////////////
{"success":"OK","file":{"name":"gitlab-add-user","type":"image\/jpeg","tmp_name":"D:\\wamp\\tmp\\php1F9B.tmp","error":0,"size":27070}}

这里的文件去掉了后缀名,主要是想测试是否可以获取到mime类型。在大于PHP5.5.0的版本中,CURL提供了一个非常简便的上传文件的方法(curl_file_create),参考代码。

注意:curl_file_create是CURLFile::__construct()的别名,也可以new CURLFile()。第一参数是文件名,第二参数mime类型,第三参数是postname,第二和第三参数都可以省略,mime类型实际这个方法本身会自动判断,第三参数一般不指定,而是建立一个键值对数组,键是postname,值就是CURLFile对象,这样可以上传多个文件。

2 PHP CURL 多线程抓取
测试程序:

[root@vfeelit public]# cat curl.php 
<?php
/**
 * Title
 * Description
 *
 * @author Jerry Sha <vfeelit@qq.com>
 */

function getDataUseMutiCurl($urls=array()){
	if(!is_array($urls)) return false;

	$mh = curl_multi_init();
	foreach($urls as $i=>$url){
		$conn[$i]=curl_init($url);
		curl_setopt($conn[$i], CURLOPT_HEADER, '');
		curl_setopt($conn[$i], CURLOPT_URL, trim($url));
		curl_setopt($conn[$i], CURLOPT_HEADER, false);
		curl_setopt($conn[$i], CURLOPT_TIMEOUT, 15);
		curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT, 5);
		
		curl_setopt($conn[$i], CURLOPT_POST, false);
	
		if ((int)preg_match('/^HTTPS/i', $url) > 0) {
			curl_setopt($conn[$i], CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($conn[$i], CURLOPT_SSL_VERIFYHOST, false);
		}
	
		curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true);
		curl_setopt($conn[$i],CURLOPT_FOLLOWLOCATION,true);
		curl_setopt($conn[$i],CURLOPT_MAXREDIRS,10);
	
		curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0");
		
		curl_multi_add_handle ($mh,$conn[$i]);
	}

	//Execute
	do {
		$mrc = curl_multi_exec($mh,$active);
	} while ($mrc == CURLM_CALL_MULTI_PERFORM);
	while ($active and $mrc == CURLM_OK) {
		if (curl_multi_select($mh) != -1) {
			do {
				$mrc = curl_multi_exec($mh, $active);
			} while ($mrc == CURLM_CALL_MULTI_PERFORM);
		}
	}
	//

	foreach ($urls as $i => $url) {
		$res[$i]=curl_multi_getcontent($conn[$i]);
		curl_close($conn[$i]);
	}
	
	return $res;
}


$t=getTime();

$total=100;

for($i=0;$i<$total;$i++)
	$url_arr[]="http://zf.vfeelit.com/do.php?i=$i";

$resutl = getDataUseMutiCurl($url_arr);
foreach($resutl as $k=>$t){
	echo $k."--".$t."  ";

	if(trim($t) == ''){
		echo "NULL\n";
	}else{
		echo "\n";
	}
}
//print_r($resutl);

runTime($t);
#----------- calculate time function-------------
function getTime(){
	$TIME=explode(" ",microtime());
	$TIME=$TIME[1].substr($TIME[0],1);
	return $TIME;
}
function runTime($t,$l=3){
	$dif=getTime()-$t;
	echo ' '.number_format($dif,$l);
}

//////////////////////////////////////
//do.php
<?php
echo rand(10000,19999);

这个脚本在我本机Window上跑步了,在拿到Linux上是可以的(Window下不支持??),有两个参数很重要,CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT,设置的太小,可能返回空,设置太长,如果遇到死链接会延时过长。curl_multi_getcontent()函数实际是从结果集合中取回内容,curl_multi_exec()执行完毕后这个结果集就得到填充,意味着如果同时请求数量比较大并且返回内容比较大,那么将消耗很大内存。

每个请求是否成功看起来并不可控,如果失败应该就是一个空串。不过,如果对于每个请求(curl_init($url)的句柄),还是可以用使用curl_errno来测试是否产生了错误,所以可以做如下改动:

// 1
	foreach ($urls as $i => $url) {
                if(curl_errno($conn[$i])){
                     $res[$i] = '';
                }else{
		     $res[$i]=curl_multi_getcontent($conn[$i]);
                }
		curl_close($conn[$i]);
	}
// 2
	foreach ($urls as $i => $url) {
                if(curl_errno($conn[$i])){
                     $res[$i]['success'] = false;
                     $res[$i]['data'] = '';
                }else{
                     $res[$i]['sucess'] = true;
		     $res[$i]['data']=curl_multi_getcontent($conn[$i]);
                }
		curl_close($conn[$i]);
	}

第二种改进方案看起来更加直观一点。


3 PHP 获取CURL的请求头信息

<?php
$url = "http://php.net/manual/zh/function.curl-setopt.php";

$ch = curl_init ();
//curl_setopt ( $ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36' );
curl_setopt ( $ch, CURLINFO_HEADER_OUT, true );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_HEADER, true );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 20 );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 20 );
curl_setopt ( $ch, CURLOPT_URL, $url );

curl_setopt ( $ch, CURLOPT_HTTPHEADER,[
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding: gzip, deflate",
    "Referer: http://php.net/curl",
    "Cookie: LAST_LANG=zh; LAST_NEWS=1453621692; COUNTRY=NA%2C113.91.66.112",
    "Connection: keep-alive",
    "If-Modified-Since: Mon, 25 Apr 2016 04:12:53 GMT",
    "Cache-Control: max-age=0"
]);
$result = curl_exec ( $ch );

$request = curl_getinfo($ch, CURLINFO_HEADER_OUT);

print_r($request);

输出:

php curl.php

GET /manual/zh/function.curl-setopt.php HTTP/1.1
Host: php.net
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://php.net/curl
Cookie: LAST_LANG=zh; LAST_NEWS=1453621692; COUNTRY=NA%2C113.91.66.112
Connection: keep-alive
If-Modified-Since: Mon, 25 Apr 2016 04:12:53 GMT
Cache-Control: max-age=0

在发起请求时设置CURLINFO_HEADER_OUT, 发起请求后,使用curl_getinfo($ch, CURLINFO_HEADER_OUT)就可以获取请求时的请求头信息。

永久链接:http://blog.ifeeline.com/1709.html

PHP函数参考 – 其它服务 – cURL

PHP函数参考-其它服务-cURL

为了使用PHP的cRUL函数,需要libcurl包的支持,libcurl下载地址:http://curl.haxx.se/,大多数Linux发行版都默认安装这个软件包:

rpm -qa | grep curl
libcurl-devel-7.19.7-37.el6_5.3.x86_64
curl-7.19.7-37.el6_5.3.x86_64
libcurl-7.19.7-37.el6_5.3.x86_64
python-pycurl-7.19.0-8.el6.x86_64

##
rpm -ql curl-7.19.7-37.el6_5.3.x86_64
/usr/bin/curl
/usr/share/doc/*
##
rpm -ql libcurl-7.19.7-37.el6_5.3.x86_64
/usr/lib64/libcurl.so.4 -> libcurl.so.4.1.1
/usr/lib64/libcurl.so.4.1.1
##
rpm -ql libcurl-devel-7.19.7-37.el6_5.3.x86_64
/usr/bin/curl-config
/usr/include/curl
/usr/include/curl/curl.h
/usr/include/curl/curlbuild-64.h
/usr/include/curl/curlbuild.h
/usr/include/curl/curlrules.h
/usr/include/curl/curlver.h
/usr/include/curl/easy.h
/usr/include/curl/mprintf.h
/usr/include/curl/multi.h
/usr/include/curl/stdcheaders.h
/usr/include/curl/typecheck-gcc.h
/usr/include/curl/types.h
/usr/lib64/libcurl.so -> libcurl.so.4.1.1
/usr/lib64/pkgconfig/libcurl.pc
/usr/share/*

先理清楚这几个软件包,curl-7.19.7-37.el6_5.3.x86_64软件包提供了一个/usr/bin/curl工具,应该是构建在libcurl之上的工具。libcurl-7.19.7-37.el6_5.3.x86_64提供的libcurl.so.4.1.1是真正可用的动态链接库,它对应的devel开发包只是添加了头文件,便于第三方工具编译。

PHP提供的cURL只是libcurl的包装器。在安装PHP之前必须先在本机安装libcurl(不过大多数Linux发行版都默认安装),然后编译时在添加–with-curl[=DIR],[=DIR]表示可选,DIR为包含lib和include的目录路径,在include目录中必须有一个名为curl,包含了easy.h和curl.h的文件夹(安装libcurl-devel时安装)。lib文件夹里应该有一个名为libcurl.so的文件(安装libcurl时安装,在安装libcurl-devel时建立了一个libcurl.so到真正动态库的链接)。

例子:

	//初始化
	$ch = curl_init();	
	
	//参数设置
	curl_setopt($ch, CURLOPT_HEADER, '');
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
	//
	curl_setopt($ch, CURLOPT_POST, false);
	//
	//curl_setopt($ch, CURLOPT_POST, true);
	//curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
	//
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
	//
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
	curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
	curl_setopt($ch,CURLOPT_MAXREDIRS,10);
	//
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0");
	
	//执行
	$result = curl_exec($ch);
	//是否产生了错误
	$errn = curl_errno($ch);
	//关闭
	curl_close($ch);

PHP的cURL中主要的函数是curl_init()和curl_setopt()和curl_exec()和curl_close(),使用套路是:curl_init()建立一个句柄,curl_setopt()为句柄设置参数,curl_exec()发起链接,从句柄获取信息返回,curl_close()关闭句柄。

由于curl_setopt()可用参数实在太多了,具体使用时还要参考文档,下面备注一下常用的:

CURLOPT_URL		需要获取的URL地址,也可以在curl_init()函数中设置。
CURLOPT_HEADER		启用时会将头文件的信息作为数据流输出。
CURLOPT_TIMEOUT		设置cURL允许执行的最长秒数。
CURLOPT_CONNECTTIMEOUT	在发起连接前等待的时间,如果设置为0,则无限等待。对应一个CURLOPT_CONNECTTIMEOUT_MS,单位为毫秒。
CURLOPT_POST		启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
CURLOPT_POSTFIELDS	全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1&para2=val2&...'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。
CURLOPT_SSL_VERIFYPEER	禁用后cURL将终止从服务端进行验证(默认启用)。
CURLOPT_SSL_VERIFYHOST	
CURLOPT_RETURNTRANSFER	将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
CURLOPT_FOLLOWLOCATION	启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
CURLOPT_MAXREDIRS	指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。
CURLOPT_USERAGENT	在HTTP请求中包含一个"User-Agent: "头的字符串。

curl_setopt()每次只能设置一个,也可以把相关参数组装成一个数组,然后传递给curl_setopt_array()一次性设置。

要知道cURL是否成功执行(是否产生了错误),可以通过调用curl_errno()获取返回码判断。如果要根据这个返回码获取具体的错误信息,可以调用curl_strerror()。

相对每次执行一个请求,PHP的cURL提供了可以执行多次请求的方法,先看官方文档的一个例子:

// 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 创建批处理cURL句柄
$mh = curl_multi_init();

// 增加2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$running=null;
// 执行批处理句柄
do {
    usleep(10000);
    curl_multi_exec($mh,$running);
} while ($running > 0);

// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

curl_multi_exec()第二参数控制执行是否已经完成。从例子来看,它只是curl_exec()的包装器。往批处理句柄添加句柄需要调用curl_multi_add_handle()而移除就是curl_multi_remove_handle()。

以上的例子会不会一个疑问就是由于是同时发起多个请求,那么如何获取请求的结果呢?为此,PHP的cURL提供了curl_multi_getcontent(resource $ch )函数。

总体上,PHP的cURL主要内容就这些了,细节内容很多,实际使用时还必须时常参考文档。

永久链接:http://blog.ifeeline.com/1139.html