php 的curl只php curl发送post请求一次数据

PHP模拟发送POST请求之五curl基本使用和多线程优化_PHP技巧_动态网站制作指南
PHP模拟发送POST请求之五curl基本使用和多线程优化
来源:人气:836
今天来介绍模拟发送POST请求的重型武器&&cURL函数库的使用和其多线程的优化方法。
说起cURL函数,可谓是老生常谈,但网上许多资料都在关键部分语焉不详,列出一大堆手册上的东西,搞得我入门时也万分痛苦,我翻了些资料,结合自己的笔记,总结了这篇博文,希望能给初次接触cURL的开发者提供一些帮助。
cURL的基本使用步骤
首先来介绍cURL:
cURL按照HTTP头信息来模拟浏览器传输数据,它支持FTP,&FTPS,&HTTP,&HTTPS,&DICT,&FILE等协议,拥有HTTPS认证,HTTP&POST方法,HTTP&PUT方法,FTP上传,HTTP上传,代理服务器,cookies,用户名/密码认证等功能。cURL可谓是实现爬站抓取网页、POST数据等功能的利器。
使用cURL函数主要分为四部分:
1.初始化cURL。
2.设置cURL变量,这是cRUL的核心,扩展功能全靠这一步骤。
3.执行cURL,获取结果。
4.关闭连接,回收资源。
$ch = curl_init();//1
curl_setopt($ch, CURLOPT_URL, "http://localhost");//2
$output = curl_exec($ch);//3
curl_close($ch);//4
另外,我们还可以使用curl_getinfo($ch)函数获取curl执行的信息,其结果为一个数组
$info数组的内容包括如下等内容:
&url&&//资源网络地址&
&content_type&&//内容编码&
&http_code&&//HTTP状态码&&
&filetime&&//文件创建时间&
&total_time&&//总耗时&
&size_upload&&//上传数据的大小&
&size_download&&//下载数据的大小&
&speed_download&&//下载速度&
&speed_upload&&//上传速度&
&download_content_length&//下载内容的长度&
&upload_content_length&&//上传内容的长度&
cURL的常用设置
下面详细介绍curl使用第二步时常用的变量设置,在使用curl函数时,可以按各种需求来设置。
设置基本信息:
curl_setopt($ch,&CURLOPT_URL,&$string);//设置curl的目录地址
curl_setopt($ch,&CURLOPT_PORT,&$port);//设置连接端口,一般不设置默认80
curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);//返回结果流,并不是输出它留待后续处理,一般会设置这一项,稍后处理抓取到的信息,而不是直接输出出来。
设置POST数据信息:
curl_setopt($ch,&CURLOPT_POST,&1);//设置传送数据方式为POST
curl_setopt($ch,&CURLOPT_POSTFIELDS,&$string);//设置要传输的数据
设置验证信息:
curl_setopt($ch,&CURLOPT_COOKIE,&$string);//设置curl执行时所携带的Cookie信息
curl_setopt($ch,&CURLOPT_USERAGENT,&$string);//设置curl模拟的浏览器信息
curl_setopt($ch,&CURLOPT_REFERER,&$string);//设置header中的referer,有利于破解
curl_setopt($ch,&CURLOPT_USERPWD,&$string);//传递一个连接中需要的用户名和密码,格式为:"[username]:[pass]"
curl_setopt($ch,&CURLOPT_FOLLOWLOCATION,&1);//设置允许服务器重定向
设置强化信息:
curl_setopt($ch,&CURLOPT_NOBODY,&1);//设置不允许输出HTML&body体,如果在抓取页面标题等信息时设置此选项会大大加快速度
curl_setopt($ch,&CURLOPT_TIMEOUT,&$int);//设置允许执行的最长秒数(超时时间),设置数值小的时候,CURL会放弃执行时间长的页面
curl_setopt($ch,&CURLOPT_HEADER,&1);//设置允许将读取目标时产生的header头文件包含在输出流中
cURL批处理功能的基本使用
当然cURL的功能并不止于此,在手册上你可以找到它更多的变量设置。而且cURL最强大的地方在其批处理功能。
cURL的批处理似乎也很好理解,以下是一般步骤:
1.$mh&=&curl_multi_init();//初始化一个批处理句柄。
2.curl_multi_add_handle($mh,$ch);&//往批处理句柄中添加设置好的$ch句柄。
3.curl_multi_exec($mh,$running);//执行$mh句柄,并将$mh句柄的运行状态写入$running变量中
4.当$running为true时循环执行curl_multi_close()函数
5.循环结束后遍历$mh句柄,用curl_multi_getcontent()获取第一个句柄的返回值
6.用curl_multi_remove_handle()将$mh中的句柄移除
7.用curl_multi_close()关闭$mh批处理句柄。
代码如下:
$chArr=[];
for($i=0;$i&50;$i++){
  $chArr[$i]=curl_init("");
 curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
$mh = curl_multi_init(); //1
foreach($chArr as $k =& $ch){
  curl_multi_add_handle($mh,$ch); //2
$running = null;
  curl_multi_exec($mh,$running); //3
}while($running & 0); //4
foreach($chArr as $k =& $ch){
$result[$k]= curl_multi_getcontent($ch); //5
curl_multi_remove_handle($mh,$ch);//6
curl_multi_close($mh); //7
cURL批处理时内存占用过多的问题
但是,执行大批量的句柄时我们会发现一个很严重的问题,那就是执行时系统CPU占用率几乎100%,几乎是死机状态了。纠其原因,那是因为在$running&0,执行&&curl_multi_exec($mh,$running)而整个批处理句柄没有全部执行完毕时,系统会不停地执行curl_multi_exec()函数。我们用实验来证明:
我们在循环中curl_multi_exec($mh,$running)句前加入一个echo&"a";的语句。我们的目的是执行50次对百度的访问,然后来看一下结果。
从图中滚动条的大小(滚动条已经最小状态了)可以大概看出输出a的个数,500个也不止,所以我们便可以找到占用CPU的罪魁祸首了。
cURL批处理时的内存优化方案
进行改动的方式是应用curl函数库中的curl_multi_select()函数,其函数原型如下: &
int&curl_multi_select&(&resource&$mh&[,&float&$timeout&=&1.0&]&)
阻塞直到cURL批处理连接中有活动连接。成功时返回描述符集合中描述符的数量。失败时,select失败时返回-1,否则返回超时(从底层的select系统调用)。
我用们curl_multi_select()函数来达到没有需要读取的程序就阻塞住的目的。
我们对批处理的第3、4步进行优化,利用其多线程,模拟并发程序。
很多朋友会对手册中提供的代码心存疑惑(我一开始也是),下面的代码及解释。
$running = null;
$mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
//本次循环第一次处理$mh批处理中的$ch句柄,并将$mh批处理的执行状态写入$running,当状态值等于CURLM_CALL_MULTI_PERFORM时,表明数据还在写入或读取中,执行循环,当第一次$ch句柄的数据写入或读取成功后,状态值变为CURLM_OK,跳出本次循环,进入下面的大循环之中。
//$running为true,即$mh批处理之中还有$ch句柄正待处理,$mrc==CURLM_OK,即上一次$ch句柄的读取或写入已经执行完毕。
while ($running && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {//$mh批处理中还有可执行的$ch句柄,curl_multi_select($mh) != -1程序退出阻塞状态。
//继续执行需要处理的$ch句柄。
 $mrc = curl_multi_exec($mh, $running);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
这样执行的好处是$mh批处理中的$ch句柄会在读取或写入数据结束后($mrc==CURLM_OK),进入curl_multi_select($mh)的阻塞阶段,而不会在整个$mh批处理执行时不停地执行curl_multi_exec,白白浪费CPU资源。
cURL批处理的内存优化结果
完整代码如下:
$chArr=[];
for($i=0;$i&50;$i++){
$chArr[$i]=curl_init("");
curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
$mh = curl_multi_init();
foreach($chArr as $k =& $ch)
curl_multi_add_handle($mh,$ch);
$running = null;
        $mrc = curl_multi_exec($mh, $running);
     } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($running && $mrc == CURLM_OK) {
      if (curl_multi_select($mh) != -1) {
      do {
      $mrc = curl_multi_exec($mh, $running);
     } while ($mrc == CURLM_CALL_MULTI_PERFORM);
     }
foreach($chArr as $k =& $ch){
$result[$k]= curl_multi_getcontent($ch);
curl_multi_remove_handle($mh,$ch);
curl_multi_close($mh);
我们再次在&$mrc&=&curl_multi_exec($mh,&$running)句子前加入echo&"a";结果如下图:
虽然也不止50次,但是比之未优化前,CPU使用率已经大为改观。
虽然curl函数非常强大,但是我们还是有使用其他函数来发送POST请求的机会,另外也能从更底层了解curl函数,所以本辑也用大很大篇幅在其他函数上。
OK,本辑结束,写这辑博文的同时,我也学习到了很多。如果您觉得本博文对您有帮助,请您点推荐或关注我,我们继续分享我的笔记总结。如果有什么问题,您可以在下方留言讨论,谢谢阅读。
优质网站模板中国领先的IT技术网站
51CTO旗下网站
在PHP中使用CURL,“撩”服务器只需几行――php curl详细解析和常见大坑
这是PHP对于curl的一个解释,简单地说就是,curl是一个库,能让你通过URL和许多不同种的服务器进行勾搭、搭讪和深入交流,并且还支持许多协议。并且人家还说了curl可以支持https认证、http post、ftp上传、代理、cookies、简单口令认证等等功能。
作者:StinsonZhao来源:| 09:48
作为开发,妹子没得撩就&撩&下服务器吧,妹子有得撩的同学那就左拥妹子右抱服务器吧,况且妹子是要礼物的,服务器又不用。好啦,长话短说再长说,祭出今天的工具&&CURL(Client
URL Library),当然今天以PHP的方式来使用这件工具。
0. curl是个什么东西
PHP supports libcurl, a library created by Daniel Stenberg, that allows you
to connect and communicate to many different types of servers with many
different types of protocols. libcurl currently supports the http, https, ftp,
gopher, telnet, dict, file, and ldap protocols. libcurl also supports HTTPS
certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with
PHP's ftp extension), HTTP form based upload, proxies, cookies, and
user+password authentication.
这是PHP对于curl的一个解释,简单地说就是,curl是一个库,能让你通过URL和许多不同种的服务器进行勾搭、搭讪和深入交流,并且还支持许多协议。并且人家还说了curl可以支持https认证、http
post、ftp上传、代理、cookies、简单口令认证等等功能啦。
说了那么多其实没什么感觉吧,在应用中才有感觉,我起初也是需要在服务器端向另一个服务器发起一个POST请求才开始接触curl的,然后才有了感觉。
在正式讲怎么用之前啊,先提一句,你得先在你的PHP环境中安装和启用curl模块,具体方式我就不讲了,不同系统不同安装方式,可以google查一下,或者查阅PHP官方的文档,还挺简单的。
1. 拿来先试试手
工具到手,先要把玩,试试顺不顺手,不然一拿来就用,把你自己的代码搞得乌烟瘴气还怎么去撩服务器呢?
比如我们以著名的&测试网络是否连接&的网站&&百度为例,来尝试下curl
&?php&&&&&&//&create&curl&resource&&&&&$ch&=&curl_init();&&&&&&//&set&url&&&&&curl_setopt($ch,&CURLOPT_URL,&&&);&&&&&&//return&the&transfer&as&a&string&&&&&curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);&&&&&&//&$output&contains&the&output&string&&&&&$output&=&curl_exec($ch);&&&&&&&//echo&output&&&&&echo&$output;&&&&&//&close&curl&resource&to&free&up&system&resources&&&&&curl_close($ch);&&&&&&&?&&
当你在本地环境浏览器打开这个php文件时,页面出现的是百度的首页,特么我刚才输入的&localhost&呢?
上面的代码和注释已经充分说明了这段代码在干啥。
$ch = curl_init(),创建了一个curl会话资源,成功返回一个句柄;
curl_setopt($ch, CURLOPT_URL, &&),设置URL,不用说;
上面两句可以合起来变一句$ch = curl_init(&&);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,
0)这是设置是否将响应结果存入变量,1是存入,0是直接echo出;
$output = curl_exec($ch)执行,然后将响应结果存入$output变量,供下面
curl_close($ch)关闭这个curl会话资源。
PHP中使用curl大致就是这么一个形式,其中第二步,通过curl_setopt方法来设置参数是最复杂也是最重要的,感兴趣可以去看官方的关于可设置参数的详细参考,长地让你看得想吐,还是根据需要熟能生巧吧。
小结一下,php中curl用法就是:创建curl会话 -& 配置参数 -& 执行 -& 关闭会话。
下面我们来看一些常用的情景,我们需要如何&打扮自己&(配置参数)才能正确&撩妹&(正确撩到服务器)。
2. 打个招呼&&GET和POST请求以及HTTPS协议处理
先和服务器打个招呼吧,给服务器发个Hello看她怎么回,这里最方便的方式就是向服务器发出GET请求,当然POST这种小纸条也OK咯。
2.1 GET请求
我们以&在某著名同性交友网站github中搜索关键词&为例
//通过curl进行GET请求的案例&&?php&&&&&&//&create&curl&resource&&&&&$ch&=&curl_init();&&&&&&//&set&url&&&&&curl_setopt($ch,&CURLOPT_URL,&&/search?q=react&);&&&&&&//return&the&transfer&as&a&string&&&&&curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);&&&&&&//&$output&contains&the&output&string&&&&&$output&=&curl_exec($ch);&&&&&&//echo&output&&&&echo&$output;&&&&&//&close&curl&resource&to&free&up&system&resources&&&&&curl_close($ch);&&&&&&&?&&
好像和之前那个例子没啥差别,但这里有2个可以提的点:
1.默认请求方式是GET,所以不需要显式指定GET方式;
2.https请求,非http请求,可能有人在各个地方看到过HTTPS请求需要加几行代码绕过SSL证书的检查等方式来成功请求到资源,但是这里好像并不需要,原因是什么?
The two Curl options are defined as:
CURLOPT_SSL_VERIFYPEER&-&verify&the&peer's&SSL&certificate&&CURLOPT_SSL_VERIFYHOST&-&verify&the&certificate's&name&against&host&
They both default to true in Curl, and shouldn't be disabled unless you've
got a good reason. Disabling them is generally only needed if you're sending
requests to servers with invalid or self-signed certificates, which is only
usually an issue in development. Any publicly-facing site should be presenting a
valid certificate, and by disabling these options you're potentially opening
yourself up to security issues.
即,除非用了非法或者自制的证书,这大多数出现在开发环境中,你才将这两行设置为false以避开ssl证书检查,否者不需要这么做,这么做是不安全的做法。
2.2 POST请求
那如何进行POST请求呢?为了测试,先在某个测试服务器传了一个接收POST的脚本:
//testRespond.php&&?php&&&&&&&$phpInput=file_get_contents('php://input');&&&&&echo&urldecode($phpInput);&?&&
发送普通数据
然后在本地写一个请求:
&?php&&&&&&$data=array(&&&&&&name&&=&&&Lei&,&&&&&&msg&&=&&&Are&you&OK?&&&&&&);&&&&&&$ch&=&curl_init();&&&&&&&curl_setopt($ch,&CURLOPT_URL,&&http://测试服务器的IP马赛克/testRespond.php&);&&&&&&curl_setopt($ch,&CURLOPT_POST,&1);&&&&&//The&number&of&seconds&to&wait&while&trying&to&connect.&Use&0&to&wait&indefinitely.&&&&&curl_setopt($ch,&CURLOPT_CONNECTTIMEOUT,&60);&&&&&&curl_setopt($ch,&CURLOPT_POSTFIELDS&,&http_build_query($data));&&&&&curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);&&&&&&&$output&=&curl_exec($ch);&&&&&&&echo&$output;&&&&&&curl_close($ch);&&&&&&&?&&
浏览器运行结果是:
name=Lei&msg=Are&you&OK?&
这里我们是构造了一个数组作为POST数据传给服务器:
curl_setopt($ch, CURLOPT_POST, 1)表明是POST请求;
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,
60)设置一个最长的可忍受的连接时间,秒为单位,总不能一直等下去变成木乃伊吧;
curl_setopt($ch, CURLOPT_POSTFIELDS ,
http_build_query($data))设置POST的数据域,因为这里是数组数据形式的(等会来讲json格式),所以用http_build_query处理一下。
对于json数据呢,又怎么进行POST请求呢?
&?php&&&&&&$data='{&name&:&Lei&,&msg&:&Are&you&OK?&}';&&&&&&$ch&=&curl_init();&&&&&&&curl_setopt($ch,&CURLOPT_URL,&&http://测试服务器的IP马赛克/testRespond.php&);&&&&&&curl_setopt($ch,&CURLOPT_POST,&1);&&&&&curl_setopt($ch,&CURLOPT_CONNECTTIMEOUT,&60);&&&&&&curl_setopt($ch,&CURLOPT_HTTPHEADER,&array('Content-Type:&application/json',&'Content-Length:'&.&strlen($data)));&&&&&curl_setopt($ch,&CURLOPT_POSTFIELDS&,&$data);&&&&&curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);&&&&&&&$output&=&curl_exec($ch);&&&&&&&echo&$output;&&&&&&curl_close($ch);&&&&&&&?&&
浏览器执行,显示:
{&name&:&Lei&,&msg&:&Are&you&OK?&}&
3. 如何上传和下载文件
已经和服务器勾搭上了,这时候得要个照片来看一看了吧,你也得把自己的照片发上去让人看一看了,虽然两个人在一起外貌不重要,但是男俊女靓总是最棒的。
3.1 传一张自己的照片过去表表诚意 && POST上传文件
同样远程服务器端我们先传好一个接收脚本,接收图片并且保存到本地,注意文件和文件夹权限问题,需要有写入权限:
&?php&&&&&if($_FILES){&&&&&&&&&$filename&=&$_FILES['upload']['name'];&&&&&&&&&&&$tmpname&=&$_FILES['upload']['tmp_name'];&&&&&&&&&&&//保存图片到当前脚本所在目录&&&&&&&&&&&if(move_uploaded_file($tmpname,dirname(__FILE__).'/'.$filename)){&&&&&&&&&&&&&echo&('上传成功');&&&&&&&&&&&}&&&&&}&?&&
然后我们再来写我们本地服务器的php curl部分:
&?php&&&&&&$data&=&array('name'=&'boy',&&upload&=&&@boy.png&);&&&&&&$ch&=&curl_init();&&&&&&&curl_setopt($ch,&CURLOPT_URL,&&http://远程服务器地址马赛克/testRespond.php&);&&&&&&curl_setopt($ch,&CURLOPT_POST,&1);&&&&&curl_setopt($ch,&CURLOPT_CONNECTTIMEOUT,&60);&&&&&&curl_setopt($ch,&CURLOPT_POSTFIELDS&,&$data);&&&&&curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);&&&&&&&$output&=&curl_exec($ch);&&&&&&&echo&$output;&&&&&&curl_close($ch);&&&&&&&&&&?&&
浏览器中运行一下,什么都米有,去看一眼远程的服务器,还是什么都没有,并没有上传成功。
为什么会这样呢?上面的代码应该是大家搜索curl php
POST图片最常见的代码,这是因为我现在用的是PHP5.6以上版本,@符号在PHP5.6之后就弃用了,PHP5.3依旧可以用,所以有些同学发现能执行啊,有些发现不能执行,大抵是因为PHP版本的不同,而且curl在这两版本中实现是不兼容的,上面是PHP5.3的实现。
下面来讲PHP5.6及以后的实现,:
&?php&&&&&&$data&=&array('name'=&'boy',&&upload&=&&&);&&&&&$ch&=&curl_init();&&&&&&&$data['upload']=new&CURLFile(realpath(getcwd().'/boy.png'));&&&&&&curl_setopt($ch,&CURLOPT_URL,&&http://115.29.247.189/test/testRespond.php&);&&&&&curl_setopt($ch,&CURLOPT_POST,&1);&&&&&curl_setopt($ch,&CURLOPT_CONNECTTIMEOUT,&60);&&&&&&curl_setopt($ch,&CURLOPT_POSTFIELDS&,&$data);&&&&&curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);&&&&&&&$output&=&curl_exec($ch);&&&&&&&echo&$output;&&&&&&curl_close($ch);&&&&&&&&&&?&&
这里引入了一个CURLFile对象进行实现,关于此的具体可查阅文档进行了解。这时候再去远程服务器目录下看看,发现有了一张图片了,而且确实是我们刚才上传的图片。
3.2 获取远程服务器妹子的照片 && 抓取图片
服务器妹子也挺实诚的,看了照骗觉得我长得挺慈眉善目的,就大方得拿出了她自己的照片,但是有点害羞的是,她不愿意主动拿过来,得我们自己去取。
远程服务器在她自己的目录下存放了一个图片叫girl.jpg,地址是她的web服务器根目录/girl.jpg,现在我要去获取这张照片。
&?php&&&&&&$ch&=&curl_init();&&&&&&&$fp=fopen('./girl.jpg',&'w');&&&&&&curl_setopt($ch,&CURLOPT_URL,&&http://远程服务器地址马赛克/girl.jpg&);&&&&&&curl_setopt($ch,&CURLOPT_CONNECTTIMEOUT,&60);&&&&&&curl_setopt($ch,&CURLOPT_FILE,&$fp);&&&&&&&$output&=&curl_exec($ch);&&&&&&$info&=&curl_getinfo($ch);&&&&&&fclose($fp);&&&&&&$size&=&filesize(&./girl.jpg&);&&&&&if&($size&!=&$info['size_download'])&{&&&&&&&&&echo&&下载的数据不完整,请重新下载&;&&&&&}&else&{&&&&&&&&&echo&&下载数据完整&;&&&&&}&&&&&&curl_close($ch);&&&&&?&&
现在,在我们当前目录下就有了一张刚拿到的照片啦,是不是很激动呢!
这里值得一说的是curl_getinfo方法,这是一个获取本次请求相关信息的方法,对于调试很有帮助,要善用。
4. HTTP认证怎么搞
这个时候呢,服务器的家长说这个我们女儿还太小,不能找对象,就将她女儿关了起来,并且上了一个密码锁,所谓的HTTP认证,服务器呢偷偷托信鸽将HTTP认证的用户名和密码给了你,要你去见她,带她私奔。
那么拿到了用户名和密码,我们怎么通过PHP CURL搞定HTTP认证呢?
PS:这里偷懒就不去搭HTTP认证去试了,直接放一段代码,我们分析下。
function&curl_auth($url,$user,$passwd){&&&&&$ch&=&curl_init();&&&&&curl_setopt_array($ch,&[&&&&&&&&&CURLOPT_USERPWD&=&&$user.':'.$passwd,&&&&&&&&&CURLOPT_URL&&&&&=&&$url,&&&&&&&&&CURLOPT_RETURNTRANSFER&=&&true&&&&&]);&&&&&$result&=&curl_exec($ch);&&&&&curl_close($ch);&&&&&return&$&}&&$authurl&=&'http://要请求HTTP认证的地址';&&echo&curl_auth($authurl,'vace','passwd');&
这里有一个地方比较有意思:
curl_setopt_array 这个方法可以通过数组一次性地设置多个参数,防止有些需要多处设置的出现密密麻麻的curl_setopt方法。
5.利用cookie模拟登陆
这时你成功见到了服务器妹子,想带她私奔,但是无奈没有盘缠走不远,服务器妹子说,她妈服务器上有金库,可以登陆上去搞一点下来。
首先我们先来分析一下,这个事情分两步,一是去登陆界面通过账号密码登陆,然后获取cookie,二是去利用cookie模拟登陆到信息页面获取信息,大致的框架是这样的。
&?php&&&&//设置post的数据&&&&&$post&=&array&(&&&&&&'email'&=&&'账户',&&&&&&'pwd'&=&&'密码'&&&);&&&&//登录地址&&&&&$url&=&&登陆地址&;&&&&&//设置cookie保存路径&&&&&$cookie&=&dirname(__FILE__)&.&'/cookie.txt';&&&&&//登录后要获取信息的地址&&&&&$url2&=&&登陆后要获取信息的地址&;&&&&&//模拟登录&&&&login_post($url,&$cookie,&$post);&&&&&//获取登录页的信息&&&&&$content&=&get_content($url2,&$cookie);&&&&&//删除cookie文件&&&&@&unlink($cookie);&&&&&&&&&var_dump($content);&&&&&?&&
然后我们思考下下面两个方法的实现:
login_post($url, $cookie, $post)
get_content($url2, $cookie)
//模拟登录&&&function&login_post($url,&$cookie,&$post)&{&&&&&&$curl&=&curl_init();&&&&&curl_setopt($curl,&CURLOPT_URL,&$url);&&&&&curl_setopt($curl,&CURLOPT_RETURNTRANSFER,&0);&&&&&curl_setopt($curl,&CURLOPT_COOKIEJAR,&$cookie);&&&&&curl_setopt($curl,&CURLOPT_POST,&1);&&&&&curl_setopt($curl,&CURLOPT_POSTFIELDS,&http_build_query($post));&&&&&curl_exec($curl);&&&&&&curl_close($curl);&}&&&
//登录成功后获取数据&&&function&get_content($url,&$cookie)&{&&&&&&$ch&=&curl_init();&&&&&&curl_setopt($ch,&CURLOPT_URL,&$url);&&&&&&curl_setopt($ch,&CURLOPT_HEADER,&0);&&&&&&curl_setopt($ch,&CURLOPT_RETURNTRANSFER,&1);&&&&&&curl_setopt($ch,&CURLOPT_COOKIEFILE,&$cookie);&&&&&&$rs&=&curl_exec($ch);&&&&&&curl_close($ch);&&&&&&return&$&&}&&
至此,总算是模拟登陆成功,一切顺利啦,通过php CURL&撩&服务器就是这么简单。
当然,CURL的能力远不止于此,本文仅希望就后端PHP开发中最常用的几种场景做一个整理和归纳。最后一句话,具体问题具体分析。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点原创热点头条头条
24H热文一周话题本月最赞
讲师:30641人学习过
讲师:151061人学习过
讲师:119828人学习过
精选博文论坛热帖下载排行
本书将实时系统、实时统一建模语言、实时系统的统一开发过程和Rational Rose RealTime建模环境有机地结合起来,以案例为基础,系统地介绍了...
订阅51CTO邮刊cURL可以使用URL的语法模拟浏览器来传输数据,因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等协议都可以很好的支持,包括一些:HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,keyberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http代理服务器管道,甚至它还支持IPv6,scoket5代理服务器,通过http代理服务器上传文件到FTP服务器等等。
使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。
1、PHP建立CURL请求的基本步骤
①:初始化
curl_init()
②:设置属性
curl_setopt().有一长串cURL参数可供设置,它们能指定URL请求的各个细节。
③:执行并获取结果
curl_exec()
④:释放句柄
curl_close()
php curl 发送get请求:
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, '');
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//执行命令
$data = curl_exec($curl);
echo curl_getinfo($curl,CURLINFO_HTTP_CODE); //输出请求状态码
//关闭URL请求
curl_close($curl);
//显示获得的数据
print_r($data);
php curl 发送post请求:
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, 'http://localhost/test/test.php');
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//设置post数据
$post_data = array(
&title& =& &&,
&content& =& &&
//post提交的数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
//显示获得的数据
print_r($data);
$title = $_REQUEST['title'];
$content = $_REQUEST['content'];
error_log($title.&\n&,3,'error.log');
error_log($content.&\n&,3,'error.log');
echo 'ok';
3、PHP cURL 函数:
以下包含了PHP cURL函数列表:
关闭一个cURL会话。
复制一个cURL句柄和它的所有选项。
返回最后一次的错误号。
返回一个保护当前会话最近一次错误的字符串。
返回转义字符串,对给定的字符串进行URL编码。
执行一个cURL会话。
创建一个 CURLFile 对象。
获取一个cURL连接资源句柄的信息。
初始化一个cURL会话。
向curl批处理会话中添加单独的curl句柄。
关闭一组cURL句柄。
运行当前 cURL 句柄的子连接。
如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。
获取当前解析的cURL的相关传输信息。
返回一个新cURL批处理句柄。
移除curl批处理句柄资源中的某个句柄资源。
等待所有cURL批处理中的活动连接。
设置一个批处理cURL传输选项。
返回描述错误码的字符串文本。
暂停及恢复连接。
重置libcurl的会话句柄的所有选项。
为cURL传输会话批量设置选项。
设置一个cURL传输选项。
关闭cURL共享句柄。
初始化cURL共享句柄。
设置一个共享句柄的cURL传输选项。
返回错误代码的字符串描述。
解码URL编码后的字符串。
获取cURL版本信息。
4、curl_setopt函数参数介绍:
bool curl_setopt(
resource $ch,int
$option, mixed $value)
参数说明:
ch & & & & & &由 curl_init() 返回的 cURL 句柄。
option & &&需要设置的CURLOPT_XXX选项。
value & & &&将设置在option选项上的值。
对于下面的这些option的可选参数,value应该被设置一个bool类型的值:
可选value值
CURLOPT_AUTOREFERER
当根据Location:重定向时,自动设置header中的Referer:信息。
CURLOPT_BINARYTRANSFER
在启用CURLOPT_RETURNTRANSFER的时候,返回原生的(Raw)输出。
CURLOPT_COOKIESESSION
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下cURL会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。
CURLOPT_CRLF
启用时将Unix的换行符转换成回车换行符。
CURLOPT_DNS_USE_GLOBAL_CACHE
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认启用。
CURLOPT_FAILONERROR
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息。
CURLOPT_FILETIME
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。 curl_getinfo().
CURLOPT_FOLLOWLOCATION
启用时会将服务器服务器返回的&Location: &放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。
CURLOPT_FORBID_REUSE
在完成交互以后强迫断开连接,不能重用。
CURLOPT_FRESH_CONNECT
强制获取一个新的连接,替代缓存中的连接。
CURLOPT_FTP_USE_EPRT
启用时当FTP下载时,使用EPRT (或 LPRT)命令。设置为FALSE时禁用EPRT和LPRT,使用PORT命令 only.
CURLOPT_FTP_USE_EPSV
启用时,在FTP传输过程中回复到PASV模式前首先尝试EPSV命令。设置为FALSE时禁用EPSV命令。
CURLOPT_FTPAPPEND
启用时追加写入文件而不是覆盖它。
CURLOPT_FTPASCII
CURLOPT_TRANSFERTEXT的别名。
CURLOPT_FTPLISTONLY
启用时只列出FTP目录的名字。
CURLOPT_HEADER
启用时会将头文件的信息作为数据流输出。
CURLINFO_HEADER_OUT
启用时追踪句柄的请求字符串。
从 PHP 5.1.3 开始可用。CURLINFO_前缀是故意的(intentional)。
CURLOPT_HTTPGET
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。
CURLOPT_HTTPPROXYTUNNEL
启用时会通过HTTP代理来传输。
CURLOPT_MUTE
启用时将cURL函数中所有修改过的参数恢复默认值。
CURLOPT_NETRC
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。
CURLOPT_NOBODY
启用时将不对HTML中的BODY部分进行输出。
CURLOPT_NOPROGRESS
启用时关闭curl传输的进度条,此项的默认设置为启用。
PHP自动地设置这个选项为TRUE,这个选项仅仅应当在以调试为目的时被改变。
CURLOPT_NOSIGNAL
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认启用。
cURL 7.10时被加入。
CURLOPT_POST
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
CURLOPT_PUT
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE。
CURLOPT_RETURNTRANSFER
将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
CURLOPT_SSL_VERIFYPEER
禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。
自cURL 7.10开始默认为TRUE。从cURL 7.10开始默认绑定安装。
CURLOPT_TRANSFERTEXT
启用后对FTP传输使用ASCII模式。对于LDAP,它检索纯文本信息而非HTML。在Windows系统上,系统不会把STDOUT设置成binary模式。
CURLOPT_UNRESTRICTED_AUTH
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。
CURLOPT_UPLOAD
启用后允许文件上传。
CURLOPT_VERBOSE
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。
对于下面的这些option的可选参数,value应该被设置一个integer类型的值:
可选value值
CURLOPT_BUFFERSIZE
每次获取的数据中读入缓存的大小,但是不保证这个值每次都会被填满。
在cURL 7.10中被加入。
CURLOPT_CLOSEPOLICY
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个CURLCLOSEPOLICY,但是cURL暂时还不支持。
CURLOPT_CONNECTTIMEOUT
在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS
尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。
在cURL 7.16.2中被加入。从PHP 5.2.3开始可用。
CURLOPT_DNS_CACHE_TIMEOUT
设置在内存中保存DNS信息的时间,默认为120秒。
CURLOPT_FTPSSLAUTH
FTP验证方式:CURLFTPAUTH_SSL&(首先尝试SSL),CURLFTPAUTH_TLS&(首先尝试TLS)或CURLFTPAUTH_DEFAULT&(让cURL自动决定)。
在cURL 7.12.2中被加入。
CURLOPT_HTTP_VERSION
CURL_HTTP_VERSION_NONE&(默认值,让cURL自己判断使用哪个版本),CURL_HTTP_VERSION_1_0&(强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1&(强制使用
HTTP/1.1)。
CURLOPT_INFILESIZE
设定上传文件的大小限制,字节(byte)为单位。
CURLOPT_LOW_SPEED_LIMIT
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。
CURLOPT_LOW_SPEED_TIME
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。
CURLOPT_MAXCONNECTS
允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接。
CURLOPT_MAXREDIRS
指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。
CURLOPT_PORT
用来指定连接端口。(可选项)
CURLOPT_PROTOCOLS
CURLPROTO_*的位域指。如果被启用,位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议,但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见CURLOPT_REDIR_PROTOCOLS.可用的协议选项为:CURLPROTO_HTTP、CURLPROTO_HTTPS、CURLPROTO_FTP、CURLPROTO_FTPS、CURLPROTO_SCP、CURLPROTO_SFTP、CURLPROTO_TELNET、CURLPROTO_LDAP、CURLPROTO_LDAPS、CURLPROTO_DICT、CURLPROTO_FILE、CURLPROTO_TFTP、CURLPROTO_ALL
在cURL 7.19.4中被加入。
CURLOPT_PROTOCOLS
CURLPROTO_*的位域指。如果被启用,位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议,但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见CURLOPT_REDIR_PROTOCOLS.可用的协议选项为:CURLPROTO_HTTP、CURLPROTO_HTTPS、CURLPROTO_FTP、CURLPROTO_FTPS、CURLPROTO_SCP、CURLPROTO_SFTP、CURLPROTO_TELNET、CURLPROTO_LDAP、CURLPROTO_LDAPS、CURLPROTO_DICT、CURLPROTO_FILE、CURLPROTO_TFTP、CURLPROTO_ALL
在cURL 7.19.4中被加入。
CURLOPT_PROXYAUTH
HTTP代理连接的验证方式。使用在CURLOPT_HTTPAUTH中的位域标志来设置相应选项。对于代理验证只有CURLAUTH_BASIC和CURLAUTH_NTLM当前被支持。
在cURL 7.10.7中被加入。
CURLOPT_PROXYPORT
代理服务器的端口。端口也可以在CURLOPT_PROXY中进行设置。
CURLOPT_PROXYTYPE
不是CURLPROXY_HTTP&(默认值) 就是CURLPROXY_SOCKS5。
在cURL 7.10中被加入。
CURLOPT_REDIR_PROTOCOLS
CURLPROTO_*中的位域值。如果被启用,位域值将会限制传输线程在CURLOPT_FOLLOWLOCATION开启时跟随某个重定向时可使用的协议。这将使你对重定向时限制传输线程使用被允许的协议子集默认libcurl将会允许除FILE和SCP之外的全部协议。这个和7.19.4预发布版本种无条件地跟随所有支持的协议有一些不同。关于协议常量,请参照CURLOPT_PROTOCOLS。
在cURL 7.19.4中被加入。
CURLOPT_RESUME_FROM
在恢复传输时传递一个字节偏移量(用来断点续传)。
CURLOPT_SSL_VERIFYHOST
1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。2 检查公用名是否存在,并且是否与提供的主机名匹配。
CURLOPT_SSLVERSION
使用的SSL版本(2 或 3)。默认情况下PHP会自己检测这个值,尽管有些情况下需要手动地进行设置。
CURLOPT_TIMECONDITION
如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,如果没有被修改过,并且CURLOPT_HEADER为true,则返回一个&304
Not Modified&的header,CURLOPT_HEADER为false,则使用CURL_TIMECOND_IFUNMODSINCE,默认值为CURL_TIMECOND_IFUNMODSINCE。
CURLOPT_TIMEOUT
设置cURL允许执行的最长秒数。
CURLOPT_TIMEOUT_MS
设置cURL允许执行的最长毫秒数。
在cURL 7.16.2中被加入。从PHP 5.2.3起可使用。
CURLOPT_TIMEVALUE
设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE。
对于下面的这些option的可选参数,value应该被设置一个string类型的值:
可选value值
CURLOPT_CAINFO
一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。 .
CURLOPT_CAPATH
一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_COOKIE
设定HTTP请求中&Cookie: &部分的内容。多个cookie用分号分隔,分号后带一个空格(例如, &fruit= colour=red&)。
CURLOPT_COOKIEFILE
包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
CURLOPT_COOKIEJAR
连接结束后保存cookie信息的文件。
CURLOPT_CUSTOMREQUEST
使用一个自定义的请求信息来代替&GET&或&HEAD&作为HTTP请求。这对于执行&DELETE&或者其他更隐蔽的HTTP请求。有效值如&GET&,&POST&,&CONNECT&等等。也就是说,不要在这里输入整个HTTP请求。例如输入&GET
/index.html HTTP/1.0\r\n\r\n&是不正确的。
在确定服务器支持这个自定义请求的方法前不要使用。
CURLOPT_EGDSOCKET
类似CURLOPT_RANDOM_FILE,除了一个Entropy Gathering Daemon套接字。
CURLOPT_ENCODING
HTTP请求头中&Accept-Encoding: &的值。支持的编码有&identity&,&deflate&和&gzip&。如果为空字符串&&,请求头会发送所有支持的编码类型。
在cURL 7.10中被加入。
CURLOPT_FTPPORT
这个值将被用来获取供FTP&POST&指令所需要的IP地址。&POST&指令告诉远程服务器连接到我们指定的IP地址。这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的IP地址。
CURLOPT_INTERFACE
网络发送接口名,可以是一个接口名、IP地址或者是一个主机名。
CURLOPT_KRB4LEVEL
KRB4 (Kerberos 4) 安全级别。下面的任何值都是有效的(从低到高的顺序):&clear&、&safe&、&confidential&、&private&.。如果字符串和这些都不匹配,将使用&private&。这个选项设置为NULL时将禁用KRB4
安全认证。目前KRB4 安全认证只能用于FTP传输。
CURLOPT_POSTFIELDS
全部数据使用HTTP协议中的&POST&操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1&para2=val2&...'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。
CURLOPT_PROXY
HTTP代理通道。
CURLOPT_PROXYUSERPWD
一个用来连接到代理的&[username]:[password]&格式的字符串。
CURLOPT_RANDOM_FILE
一个被用来生成SSL随机数种子的文件名。
CURLOPT_RANGE
以&X-Y&的形式,其中X和Y都是可选项获取数据的范围,以字节计。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如&X-Y,N-M&。
CURLOPT_REFERER
在HTTP请求头中&Referer: &的内容。
CURLOPT_SSL_CIPHER_LIST
一个SSL的加密算法列表。例如RC4-SHA和TLSv1都是可用的加密列表。
CURLOPT_SSLCERT
一个包含PEM格式证书的文件名。
CURLOPT_SSLCERTPASSWD
使用CURLOPT_SSLCERT证书需要的密码。
CURLOPT_SSLCERTTYPE
证书的类型。支持的格式有&PEM&&(默认值),&&DER&和&ENG&。
在cURL 7.9.3中被加入。
CURLOPT_SSLENGINE
用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。
CURLOPT_SSLENGINE_DEFAULT
用来做非对称加密操作的变量。
CURLOPT_SSLKEY
包含SSL私钥的文件名。
CURLOPT_SSLKEYPASSWD
在CURLOPT_SSLKEY中指定了的SSL私钥的密码。
由于这个选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。
CURLOPT_SSLKEYTYPE
CURLOPT_SSLKEY中规定的私钥的加密类型,支持的密钥类型为&PEM&(默认值)、&DER&和&ENG&。
CURLOPT_URL
需要获取的URL地址,也可以在curl_init()函数中设置。
CURLOPT_USERAGENT
在HTTP请求中包含一个&User-Agent: &头的字符串。
CURLOPT_USERPWD
传递一个连接中需要的用户名和密码,格式为:&[username]:[password]&。
对于下面的这些option的可选参数,value应该被设置一个数组:
可选value值
CURLOPT_HTTP200ALIASES
200响应码数组,数组中的响应吗被认为是正确的响应,否则被认为是错误的。
在cURL 7.10.3中被加入。
CURLOPT_HTTPHEADER
一个用来设置HTTP头字段的数组。使用如下的形式的数组进行设置: array('Content-type: text/plain', 'Content-length: 100')
CURLOPT_POSTQUOTE
在FTP请求执行完成后,在服务器上执行的一组FTP命令。
CURLOPT_QUOTE
一组先于FTP请求的在服务器上执行的FTP命令。
对于下面的这些option的可选参数,value应该被设置一个流资源 (例如使用fopen()):
可选value值
CURLOPT_FILE
设置输出文件的位置,值是一个资源类型,默认为STDOUT&(浏览器)。
CURLOPT_INFILE
在上传文件的时候需要读取的文件地址,值是一个资源类型。
CURLOPT_STDERR
设置一个错误输出地址,值是一个资源类型,取代默认的STDERR。
CURLOPT_WRITEHEADER
设置header部分内容的写入的文件地址,值是一个资源类型。
对于下面的这些option的可选参数,value应该被设置为一个回调函数名:
可选value值
CURLOPT_HEADERFUNCTION
设置一个回调函数,这个函数有两个参数,第一个是cURL的资源句柄,第二个是输出的header数据。header数据的输出必须依赖这个函数,返回已写入的数据大小。
CURLOPT_PASSWDFUNCTION
设置一个回调函数,有三个参数,第一个是cURL的资源句柄,第二个是一个密码提示符,第三个参数是密码长度允许的最大值。返回密码的值。
CURLOPT_PROGRESSFUNCTION
设置一个回调函数,有三个参数,第一个是cURL的资源句柄,第二个是一个文件描述符资源,第三个是长度。返回包含的数据。
CURLOPT_READFUNCTION
回调函数名。该函数应接受三个参数。第一个是 cURL resource;第二个是通过选项CURLOPT_INFILE&传给 cURL 的 stream resource;第三个参数是最大可以读取的数据的数量。回 调函数必须返回一个字符串,长度小于或等于请求的数据量(第三个参数)。一般从传入的 stream resource 读取。返回空字符串作为&EOF(文件结束)
CURLOPT_WRITEFUNCTION
回调函数名。该函数应接受两个参数。第一个是 cURL resource;第二个是要写入的数据字符串。数 据必须在函数中被保存。函数必须返回准确的传入的要写入数据的字节数,否则传输会被一个错误所中 断。
返回值
成功时返回 TRUE, 或者在失败时返回 FALSE。
一些状态代码
1xx:请求收到,继续处理&&
2xx:操作成功收到,分析、接受&&
3xx:完成此请求必须进一步处理&&
4xx:请求包含一个错误语法或不能完成&&
5xx:服务器执行一个完全有效请求失败&
100——客户必须继续发出请求&&
101——客户要求服务器根据请求转换HTTP协议版本&
200——交易成功&&
201——提示知道新文件的URL&&
202——接受和处理、但处理未完成&&
203——返回信息不确定或不完整&&
204——请求收到,但返回信息为空&&
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件&&
206——服务器已经完成了部分用户的GET请求&
300——请求的资源可在多处得到&&
301——删除请求数据&&
302——在其他地址发现了请求数据&&
303——建议客户访问其他URL或访问方式&&
304——客户端已经执行了GET,但文件未变化&&
305——请求的资源必须从服务器指定的地址得到&&
306——前一版本HTTP中使用的代码,现行版本中不再使用&&
307——申明请求的资源临时性删除&
400——错误请求,如语法错误&&
401——请求授权失败&&
402——保留有效ChargeTo头响应&&
403——请求不允许&&
404——没有发现文件、查询或URl&&
405——用户在Request-Line字段定义的方法不允许&&
406——根据用户发送的Accept拖,请求资源不可访问&&
407——类&#,用户必须首先在代理服务器上得到授权&&
408——客户端没有在用户指定的饿时间内完成请求&&
409——对当前资源状态,请求不能完成&&
410——服务器上不再有此资源且无进一步的参考地址&&
411——服务器拒绝用户定义的Content-Length属性请求&&
412——一个或多个请求头字段在当前请求中错误&&
413——请求的资源大于服务器允许的大小&&
414——请求的资源URL长于服务器允许的长度&&
415——请求资源不支持请求项目格式&&
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求&&
也不包含If-Range请求头字段&&
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求&
500——服务器产生内部错误&&
501——服务器不支持请求的函数&&
502——服务器暂时不可用,有时是为了防止发生系统过载&&
503——服务器过载或暂停维修&&
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长&&
505——服务器不支持或拒绝支请求头中指定的HTTP版本&
本文已收录于以下专栏:
相关文章推荐
function vcurl($url, $post = '', $cookie = '', $cookiejar = '', $referer = ''){ 
$tmpInfo = ''; 
一、引言这段时间比较忙,已经很久没有写博客了。今天我就来聊聊我关于curl_multi_*函数集的使用心得,关于http请求的问题。当我们用户php发起一个http请求的时候。我们会首先想到用什么?没...
最近做了一个服务器监控,需要通过curl发出大量的http请求,这里列举了一下curl返回的常见错误码,方便下次排查问题:
最近迷恋WEB方面的技术,虽然自己是一个嵌入式工程师,但是我深知若需要把传感器终端的数据推送至“平台”必然会和WEB技术打交道。在工作中发现嵌入式工程师喜欢二进制形式的协议,例如MODBUS...
CURL connect_timeout timeout
linux curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态。
一、Linux ...
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JSON在前后台交互的过程中发挥着相当出色的作用。请接着往下看...
首先需要详看:
http://blog.csdn.net/sunchengwei/article/details/6675537
/view-blo...
First Name:
Suggestions:
clienthint.js
var xmlHttp
function showHint(str)
他的最新文章
讲师:AI100
讲师:谢梁
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 php curl 只获取数据 的文章

 

随机推荐