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自动转发人人网站代码的简化版。

Comments !

blogroll

social