Sun 08 November 2009
By yegle
In php .
tags: php curl
上次贴出来的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自动转发人人网站代码的简化版。
There are comments .