注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

PHP cURL代码举例   

2009-12-29 15:50:20|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://yegle.net/2009/11/08/php-curl-intro/

上次贴出来的twitter同步到人人的代码,很多人留言说看不懂。其实这个代码从总体上说还是比较简单的,可能大家对curl相关函数不太了解导致抱怨说看不懂。这里写篇简单的日志介绍一下curl的使用。

注意:如果你需要深入学习,请在线查看php.net的文档,本文仅仅是对不了解PHP curl函数族的用户的入门简介。代码没有经过严格检查,如有错误请留言指出。同样,全文及以下代码以CC by-nc-sa释出,转载请注明出处。

curl是client url library的缩写。使用curl可以完成几乎所有的HTTP交互。我写的PHP代码里,包括本博客上帖出来的例如自动同步twitter到人人,以及twip项目里,大量使用了这个函数族。

PHP中curl库的介绍在这里:http://us3.php.net/manual/en/book.curl.php。如果需要使用PHP做HTTP交互相关的开发,建议仔细阅读这个页面提到的各个函数。

在PHP中使用curl非常简单。典型的使用例子:

$ch = curl_init();//创建一个curl会话,返回一个curl handle.  curl_setopt($ch,CURLOPT_URL,'http://example.com');//设置该会话相关的URL地址  //在这个地方可以调用多次curl_setopt函数,进行更多具体的设置  curl_exec($ch);//执行curl操作  curl_close($ch);//结束该curl会话

各个函数的功能在注释里注明了。对于一般的开发者来说,关键的是掌握curl_setopt函数第二个参数可允许设置的所有内容。选择适当的curl_setopt参数,可以完成诸如用户名密码验证、post数据、保存cookie、使用代理连接、伪装成浏览器访问等等功能。可以说PHP中使用curl函数族的精髓在curl_setopt函数的使用。

举例说明一下几个典型的应用:
发送GET请求:

$url = 'http://example.com';  $ch = curl_init($url);  curl_exec($ch);  curl_close($ch);

访问这个PHP将得到http://example.com/页面的内容。这个代码仅仅是将GET得到的内容简单地“echo”出来,没有进行处理,也没有将网站的cookie以及header信息返回。

发送一个POST请求:

$url = 'http://example.com/index.php';  $ch = curl_init($url);  curl_setopt($ch,CURLOPT_POST,TRUE);  curl_setopt($ch,CURLOPT_POSTFIELDS,'username=test&password=asdf');  curl_exec($ch);  curl_close($ch);

这部分代码post了两个字段,username和password,执行这个脚本之后在index.php中可以通过$_POST['username']和$_POST['password']来访问这两个post字段的值

不直接输出结果,或需要先对结果进行过滤

$url = 'http://example.com';  $ch = curl_init($url);  curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);  $ret = curl_exec($ch);  curl_close($ch);  $ret = str_replace('fuck','XXXX',$ret);  echo $ret;

这部分代码,通过curl_setopt的设置,在执行curl_exec函数时不直接将结果输出,保存在$ret变量中,方便进行其他处理。注意的是:CURLOPT_RETURNTRANSFER的设置只是不让curl_exec不直接输出结果而已,无论有没有设置这个参数,curl_exec返回值里总是包含获得的页面内容。

返回服务端的完整信息:

function echo_header($ch,$str){  header($str);  return strlen($str);  }  $url = 'http://example.com/';  $ch = curl_init($url);  curl_setopt($ch,CURLOPT_HEADERFUNCTION,'echo_header');  curl_exec($ch);  curl_close($ch);

这段代码将服务端的http return header原封不动地返回给客户端。使用CURLOPT_HEADERFUNCTION设置了一个回调函数,在curl_exec时,每从服务端得到一行return header信息,就调用这个函数,将curl handler和该header的内容作为参数调用这个函数。设置的函数*必须*返回header内容的长度。如果你足够敏感的话,你会发现,这个就是Twitter API proxy的简化版本。

使用cookie保持登录:

$login = 'http://example.com/login.php';  $view = 'http://example.com/user.php';  $ch = curl_init();  curl_setopt($ch,CURLOPT_URL,$login);  curl_setopt($ch,CURLOPT_COOKIEJAR,'/tmp/cookie');  curl_setopt($ch,CURLOPT_POST,TRUE);  curl_setopt($ch,CURLOPT_POSTFIELDS,'username=test&password=mypass');  curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);  curl_exec($ch);  curl_setopt($ch,CURLOPT_URL,$view);  curl_setopt($ch,CURLOPT_COOKIEFILE,'/tmp/cookie');  $ret = curl_exec($ch);  echo $ret;

这段代码稍微有点复杂。这个代码完成了两次curl_exec,演示了如何使用一个curl handler完成多次http request。绝大多数的网站都通过SESSION COOKIE完成用户的保持登录,也就是说只要cookie在,而且session没过期,就可以用这个cookie保持登录状态。这段代码首先在$login,使用POST完成了登陆,同时将cookie保存在/tmp/cookie里。在第二次curl_exec时,curl使用这个cookie以登录后的状态抓取了user.php的内容,并echo了出来。没错,这个代码就是twitter自动转发人人网站代码的简化版。

  评论这张
 
阅读(1086)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017