什么是curl:
你可能在你编写PHP脚本代码中会遇到这样的问题:怎么样才能从其他站点获取内容呢?这里有几个解决方式 最简单的就是在PHP中使用fopen()函数 但是fopen函数没有足够的参数来使用 比如当你想构建一个”网络爬虫“ 想定义爬虫在客户端描述(IE,Firefox),通过不同的请求方式来获取内容 比如POST,GET等等 这些需求是不可能用fopen函数实现的
为了解决我们上面提出的问题 我们可以使用PHP的扩展库——curl 这个扩展库通常是默认在安装包中的 你可以用它来获取其他站点的内容 也可以来干别的。
PS:这两段代码需要php_curl扩展库的支持,查看PHPinfo() 如果curl support enabled 则表示支持curl库。
1.Windows下的PHP开启curl库支持:
打开PHP.ini 将extension=php_curl.dll前的;去掉。
2.Linux下的PHP开启curl库支持:
编译PHP时在./configure后上加上 -with-curl
如何使用curl库:
基本用法:
1.通过函数curl_init()创建一个新的curl回话,代码如下:
//create a new curl resource
$ch=curl_init();
?>
我们已经成功创建了一个curl回话 如果需要获取一个URL的内容,那么接下来的一步就是传递一个URL诶curl_setopt()函数,代码如下
curl_setopt($ch,CURLOPT_URL,"http:/www.google.com/");
?>
做完上一步工作,curl的准备工作做完了,curl将会获取URL站点的内容,并打印出来。代码如下
//grab url and pass it to the browser
curl_exec($ch);
?>
最后关闭当前的curl回话
//close curl resource and free up system resources
curl_close($ch);
下面来看看完整的实例代码:
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.nl/”);
// grab URL and pass it to the browser
curl_exec($ch);
// close curl resource, and free up system resources
curl_close($ch);
?>
我们刚刚把另外一个站点的内容,获取过来以后自动输出到浏览器。其实我们还有其他的方式组织获取的信息,然后控制其输出的内容。在curl_setopt()函数的参数中,如果希望获得内容但不进行输出,使用CURLOPT_RETURNTRANSFER参数,并设为非0值或者true, 完整代码如下:
//create a new curl resource
$ch=curl_init();
//set URL and other appropriate options
curl_setopt($ch,CUrLOPT_URL,"http://www.google.nl/");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//grab URL,and return output
$output=curl resource,and free up system resources
curl_close($ch);
//replace 'Google' with ‘PHPit’
$output=str_replace('Google','PHPit',$output);
//print output
echo $output;
?>
在上面的两个实例中 你可能注意到通过设置函数curl_setopt()不同的参数,可以获得不同的结果,这正是curl强大的原因, 下面我们来看看这些参数的含义
curl的相关选项,以下介绍常用的一些参数
<1>CURLOPT_FOLLOWLOCATION 当你把这个参数设置为true是 curl会根据任何重定向命令更深次的获取转向路径,eg:当你尝试获取一个PHP页面,然后这个PHP页面中有一段跳转代码 curl将从http://new_url获取内容,而不是返回跳转代码。代码如下:
//create a new curl resource
$ch=curl_init();
//set url and other appropriate options
curl_setopt($ch,CURLOPT_URL,"http://www.google.com/");
curl_setopt($ch,CUROPT_FOLLOWLOCATION,true);
//grab url and print
curl_exec($ch);
?>
如果Google发送一个转向请求 上面的例子将根据跳转的网址继续获取内容 和这个参数有关的两个选项是 CURLOPT_MAXREDIRS和CURLOPT_AUTOREFERER 参数CURLOPT_MAXREDIRS选项允许你定义跳转请求的最大次数 超过了这个次数将不再获取其内容 如果CURLOPT_AUTOREFERER设置为true时,curl会自动添加Referer header在每一个跳转链接,可能他不是很重要 但是在一定的案例中却非常有用
<2>CURLOPT_POST 这是一个非常有用的功能,因为它可以让你用POST请求而不是GET请求,这实际上意味着你可以提交其他形式的页面 无须在表单中填入 下面有个例子:
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL,”http://projects/phpit/content/using curl php/demos/handle_form.php”);
// Do a POST
$data = array('name' => ‘Dennis', 'surname' => ‘Pallett');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// grab URL, and print
curl_exec($ch);
?>
And the handle_form.php file:
echo ‘Form variables I received:';
echo ‘';
print_r ($_POST);
echo ‘';
?>
<3>CURLOPT_CONNECTTIMEOUT 通常又来设置curl尝试请求连接的时间 这是一个非常重要的选项 如果你把这段时间设置得太短了 可能会导致curl请求失败 但是如果你把它设置的时间太长了 可能PHP脚本将死掉 和这个参数相关的一个选项是CURLOPT_TIMEOUT 这是用来设置curl允许执行的时间需求 如果你设置为很小的值 他可能导致下载的网页是不完整的 因为他们需要一段时间才能下载
<4>CURLOPT_USERAGENT 它允许你自定义请求的客户端名称 比如webspidler或是IE6.0 示例代码如下:
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://sc.jb51.net/”);
curl_setopt($ch, CURLOPT_USERAGENT, ‘My custom web spider/0.1′);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// grab URL, and print
curl_exec($ch);
?>
下面介绍curl_getinfo()函数:
这个函数可以帮助我们获取页面的信息 函数curl_getinfo()可以使得我们获取接受页面的各种信息 你能编辑这些信息 通过设定选项的第二个参数 你也可以传递给一个数组 代码如下:
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com”);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FILETIME, true);
// grab URL
$output = curl_exec($ch);
// Print info
echo ‘';
print_r (curl_getinfo($ch));
echo ‘';
?>
大部分返回的信息是请求本身的 如这个请求花的时间 返回的头文件信息 当然也有一些页面的信息 想页面内容的大小 最后修改的时间 那些全是管与curl_getinfo()函数的
现在让我们来看看那它的实际用途 curl库的第一用途可以查看一个URL页面是否存在 我们可以通过查看这个URL的请求返回的代码来判断 比如404代表这个页面不存在 代码如下:
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/does/not/exist”);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL
$output = curl_exec($ch);
// Get response code
$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// Not found?
if ($response_code == ‘404′) {
echo ‘Page doesn\'t exist';
} else {
echo $output;
}
?>
其他的用户可能是创建一个自动检查器 验证每个请求的页面是否存在
我们可以用curl库来写和Google类似的网页蜘蛛webspider 或是其他的网页蜘蛛