php curl教程


class HttpCurl

{

    /**

* [put]

* @param  array  $params [description]

* url [必填] string 请求的地址

* data [选填] array   请求的数据,key value 对应

* option   [选填] array   curl设置的选项,key value 对应

* body [选填] string    raw,默认form-data

* @return [type]         [description]

*/

function put($params=[])

{

$url = $params['url'];

$data = isset($params['data']) ? $params['data'] : [];

$option = isset($params['option']) ? $params['option'] : [];


if(isset($params['body']) && $params['body'] == 'raw'){

$body = $data;

}else{

$body = http_build_query($data);

}


   $defaults = array(

       CURLOPT_CUSTOMREQUEST => 'PUT',

       CURLOPT_HEADER => 0,

       CURLOPT_URL => $url,

       CURLOPT_FRESH_CONNECT => 1,

       CURLOPT_RETURNTRANSFER => 1,

       CURLOPT_FORBID_REUSE => 1,

       CURLOPT_TIMEOUT => 0,

       CURLOPT_SSL_VERIFYPEER => false,

       CURLOPT_POSTFIELDS => $body

   );


   $ch = curl_init();

   curl_setopt_array($ch, ($option + $defaults));

   if( ! $result = curl_exec($ch))

   {

       trigger_error(curl_error($ch));

   }

   curl_close($ch);

   return $result;

}

    /**

* [delete]

* @param  array  $params [description]

* url [必填] string 请求的地址

* data [选填] array   请求的数据,key value 对应

* option   [选填] array   curl设置的选项,key value 对应

* body     [选填] string    raw,默认form-data

* @return [type]         [description]

*/

function delete($params=[])

{

$url = $params['url'];

$data = isset($params['data']) ? $params['data'] : [];

$option = isset($params['option']) ? $params['option'] : [];


if(isset($params['body']) && $params['body'] == 'raw'){

$body = $data;

}else{

$body = http_build_query($data);

}


   $defaults = array(

       CURLOPT_CUSTOMREQUEST => 'DELETE',

       CURLOPT_HEADER => 0,

       CURLOPT_URL => $url,

       CURLOPT_FRESH_CONNECT => 1,

       CURLOPT_RETURNTRANSFER => 1,

       CURLOPT_FORBID_REUSE => 1,

       CURLOPT_TIMEOUT => 0,

       CURLOPT_SSL_VERIFYPEER => false,

       CURLOPT_POSTFIELDS => $body

   );


   $ch = curl_init();

   curl_setopt_array($ch, ($option + $defaults));

   if( ! $result = curl_exec($ch))

   {

       trigger_error(curl_error($ch));

   }

   curl_close($ch);

   return $result;

}

/**

* [post]

* @param  array  $params [description]

* url [必填] string 请求的地址

* data [选填] array   请求的数据,key value 对应

* option   [选填] array   curl设置的选项,key value 对应

* body [选填] string    raw,默认form-data

* @return [type]         [description]

*/

function post($params=[])

{

$url = $params['url'];

$data = isset($params['data']) ? $params['data'] : [];

$option = isset($params['option']) ? $params['option'] : [];


if(isset($params['body']) && $params['body'] == 'raw'){

$body = $data;

}else{

$body = is_array($data) ? http_build_query($data) : $data;

}



   $defaults = array(

       CURLOPT_POST => 1,

       CURLOPT_HEADER => 0,

       CURLOPT_URL => $url,

       CURLOPT_FRESH_CONNECT => 1,

       CURLOPT_RETURNTRANSFER => 1,

       CURLOPT_FORBID_REUSE => 1,

       CURLOPT_TIMEOUT => 0,

       CURLOPT_SSL_VERIFYPEER => false,

       CURLOPT_POSTFIELDS => $body

   );


   $ch = curl_init();

   curl_setopt_array($ch, ($option + $defaults));

   if( ! $result = curl_exec($ch))

   {

       trigger_error(curl_error($ch));

   }

   curl_close($ch);

   return $result;

}



/**

* [get]

* @param  array  $params [description]

* url [必填] string 请求的地址

* data [选填] array  请求的数据,key value 对应

* option   [选填] array  curl设置的选项,key value 对应

* @return [type]         [description]

*/

function get($params=[])

{   

$url = $params['url'];

$data = isset($params['data']) ? $params['data'] : [];

$option = isset($params['option']) ? $params['option'] : [];

$url = empty($data) ? $url : $url. (strpos($url, '?') === FALSE ? '?' : ''). http_build_query($data);

   $defaults = array(

       CURLOPT_URL => $url,

       CURLOPT_HEADER => 0,

       CURLOPT_RETURNTRANSFER => 1,

       CURLOPT_TIMEOUT => 0,

       CURLOPT_SSL_VERIFYPEER => false

   );   

   $ch = curl_init();

   curl_setopt_array($ch, ($option + $defaults));

   if( ! $result = curl_exec($ch))

   {

       curl_error($ch);

   }

   curl_close($ch);

   return $result;


}

摘要:

在这篇文章中主要讲解php_curl库的知识,并教你如何更好的使用php_curl。

简介

你可能在你的编写PHP脚本代码中会遇到这样的问题:怎么样才能从其他站点获取内容呢?这里有几个解决方式;最简单的就是在php中使用fopen()函 数,但是fopen函数没有足够的参数来使用,比如当你想构建一个“网络爬虫”,想定义爬虫的客户端描述(IE,firefox),通过不同的请求方式来 获取内容,比如POST,GET;等等这些需求是不可能用fopen()函数实现的。

 

为了解决我们上面提出的问题,我们可以使用PHP的扩展库-Curl,这个扩展库通常是默认在安装包中的,你可以它来获取其他站点的内容,也可以来干别的。

 

 

备注:这两段代码需要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库,并看看它的其他用处,但是接下来,我们要从最基本的用法开始

基本用法:

第一步,我们通过函数curl_init()创建一个新的curl会话,代码如下:

 

<?php

// create a new curl resource

$ch = curl_init();

?>

 

我们已经成功创建了一个curl会话,如果需要获取一个URL的内容,那么接下的一步,传递一个URL给curl_setopt()函数,代码:

 

<?php

// set URL and other appropriate options

curl_setopt($ch, CURLOPT_URL, “http://www.google.com/”);

?>

 

做完上一步工作,curl的准备工作做完了,curl将会获取URL站点的内容,并打印出来。代码:

 

<?php

// grab URL and pass it to the browser

curl_exec($ch);

?>

 

最后,关闭当前的curl会话

 

<?php

//close curl resource, and free up system resources

curl_close($ch);

?>

 

下面我们来看看完成的实例代码:

 

<?php

// 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);

?>

 

(查看在线demo)

我们刚刚把另外一个站点的内容,获取过来以后自动输出到浏览器,我们有没有其他的方式组织获取的信息,然后控制其输出的内容呢?完全没有问题,在 curl_setopt()函数的参数中,如果希望获得内容但不输出,使用CURLOPT_RETURNTRANSFER参数,并设为非0值 /true!,完整代码请看:

 

<?php

// 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_exec($ch);

// close curl resource, and free up system resources

curl_close($ch);

// Replace ‘Google’ with ‘PHPit’

$output = str_replace(’Google’, ‘PHPit’, $output);

// Print output

echo $output;

?>

 

(查看在线demo)

在上面的2个实例中,你可能注意到通过设置函数curl_setopt()的不同参数,可以获得不同结果,这正是curl强大的原因,下面我们来看看这些参数的含义。

CURL的相关选项:

如果你看过php手册中的curl_setopt()函数,你可以注意到了,它下面长长的参数列表,我们不可能一一介绍,更多的内容请查看PHP手册,这里只介绍常用的和有的一些参数。

第一个很有意思的参数是 CURLOPT_FOLLOWLOCATION ,当你把这个参数设置为true时,curl会根据任何重定向命令更深层次的获取转向路径,举个例子:当你尝试获取一个PHP的页面,然后这个PHP的页面中有一段跳转代码 <?php header(”Location:http://new_url”);….?>,curl将从http://new_url获取内容,而不是返回跳转代码。完整的代码如下:

 

<?php

// 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);

// grab URL, and print

curl_exec($ch);

?>

 

(查看在线demo),

如果Google发送一个转向请求,上面的例子将根据跳转的网址继续获取内容,和这个参数有关的两个选项是CURLOPT_MAXREDIRS和CURLOPT_AUTOREFERER .

参数CURLOPT_MAXREDIRS选项允许你定义跳转请求的最大次数,超过了这个次数将不再获取其内容。如果CURLOPT_AUTOREFERER 设置为true时,curl会自动添加Referer header在每一个跳转链接,可能它不是很重要,但是在一定的案例中却非常的有用。

下一步介绍的参数是CURLOPT_POST,这是一个非常有用的功能,因为它可以让您这样做POST请求,而不是GET请求,这实际上意味着你可以提交

其他形式的页面,无须其实在表单中填入。下面的例子表明我的意思:

 

<?php

// 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);

?>

 

(View Live Demo)

And the handle_form.php file:

 

<?php

echo ‘<h3>Form variables I received: </h3>’;

echo ‘<pre>’;

print_r ($_POST);

echo ‘</pre>’;

?>

 

正如你可以看到,这使得它真的很容易提交形式,这是一个伟大的方式来测试您的所有形式,而不以填补他们在所有的时间。

参数CURLOPT_CONNECTTIMEOUT 通常用来设置curl尝试请求链接的时间,这是一个非常重要的选项,如果你把这段时间设置的太短了,可能会导致curl请求失败。

但是如果你把它设置的时间太长了,可能PHP脚本将死掉。和这个参数相关的一个选项是 CURLOPT_TIMEOUT,这是用来设置curl允许执行的时间需求。如果您设置这一个很小的值,它可能会导下载的网页上是不完整的,因为他们需要一段时间才能下载。

最后一个选项是 CURLOPT_USERAGENT,它允许你自定义请求是的客户端名称,比如webspilder或是IE6.0.示例代码如下:

 

<?php

// create a new curl resource

$ch = curl_init();

// set URL and other appropriate options

curl_setopt($ch, CURLOPT_URL, “http://www.useragent.org/”);

curl_setopt($ch, CURLOPT_USERAGENT, ‘My custom web spider/0.1′);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

// grab URL, and print

curl_exec($ch);

?>

 

(View Live Demo)

现在我们把最有意思的一个参数都介绍过了,下面我们来介绍一个curl_getinfo() 函数,看看它能为我们做些什么。

获取页面的信息:

函数curl_getinfo()可以使得我们获取接受页面各种信息,你能编辑这些信息通过设定选项的第二个参数,你也可以传递一个数组的形式。就像下面的例子:

 

<?php

// 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 ‘<pre>’;

print_r (curl_getinfo($ch));

echo ‘</pre>’;

?>

 

(View Live Demo)

大部分返回的信息是请求本身的,像:这个请求花的时间,返回的头文件信息,当然也有一些页面的信息,像页面内容的大小,最后修改的时间。

那些全是关于curl_getinfo()函数的,现在让我们看看它的实际用途。

实际用途:

curl库的第一用途可以查看一个URL页面是否存在,我们可以通过查看这个URL的请求返回的代码来判断比如404代表这个页面不存在,我们来看一些例子:

 

<?php

// 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;

}

?>

 

(View Live Demo)

其他的用户可能是创建一个自动检查器,验证每个请求的页面是否存在。

我们可以用curl库来写和google类似的网页蜘蛛(web spider),或是其他的网页蜘蛛。这篇文章不是关于如何写一个网页蜘蛛的,因此所以我们没有讲任何关于网页蜘蛛的细节问题,但是以后在PHPit 将会介绍用 curl来构造一个web spider.

结论:

在这篇文章我已经表明,如何使用php中的curl库和其大部分的选项。

为最基本的任务,只想获得一个网页,你可能不会需要CURL库,但是,一旦你想要做任何事情稍微先进的,您可能会想要使用curl库。

在近未来,我会告诉您究竟如何建立自己的网络蜘蛛,类似Google的网络蜘蛛,敬请期待,以phpit。










原文: http://www.cmx8.cn/curl.html

使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网 页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内 容,cURL 是一个功能强大的PHP库。

PHP中的CURL函数库(Client URL Library Function)

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

例子一: 基本例子
基本例子
﹤?php
// 初始化一个 cURL 对象
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://www.cmx8.cn');

// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);

// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// 运行cURL,请求网页
$data = curl_exec($curl);

// 关闭URL请求
curl_close($curl);

// 显示获得的数据
var_dump($data);

?>

例子二: POST数据

sendSMS.php,其可以接受两个表单域,一个是电话号码,一个是短信内容。
POST数据
﹤?php
$phoneNumber = '13812345678';
$message = 'This message was generated by curl and php';
$curlPost = 'pNUMBER=' . urlencode($phoneNumber) . '&MESSAGE=' . urlencode($message) . '&SUBMIT=Send';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.lxvoip.com/sendSMS.php');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = curl_exec();
curl_close($ch);
?﹥

例子三:使用代理服务器
使用代理服务器
﹤?php 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.cmx8.cn');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, 'proxy.lxvoip.com:1080');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');
$data = curl_exec();
curl_close($ch);
?﹥

例子四: 模拟登录

Curl 模拟登录 discuz 程序,适合DZ7.0,将username改成你的用户名,userpass改成你的密码就可以了.
Curl 模拟登录 discuz 程序
<?php 

  
  
  
!extension_loaded('curl') && die('The curl extension is not loaded.');   
  
$discuz_url = 'http://www.lxvoip.com';//论坛地址   
$login_url = $discuz_url .'/logging.php?action=login';//登录页地址   
$get_url = $discuz_url .'/my.php?item=threads'; //我的帖子   
  
$post_fields = array();   
//以下两项不需要修改   
$post_fields['loginfield'] = 'username';   
$post_fields['loginsubmit'] = 'true';   
//用户名和密码,必须填写   
$post_fields['username'] = 'lxvoip';   
$post_fields['password'] = '88888888';   
//安全提问   
$post_fields['questionid'] = 0;   
$post_fields['answer'] = '';   
//@todo验证码   
$post_fields['seccodeverify'] = '';   
  
//获取表单FORMHASH   
$ch = curl_init($login_url);   
curl_setopt($ch, CURLOPT_HEADER, 0);   
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
$contents = curl_exec($ch);   
curl_close($ch);   
preg_match('/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);   
if(!empty($matches)) {   
    $formhash = $matches[1];   
} else {   
    die('Not found the forumhash.');   
}   
  
//POST数据,获取COOKIE   
$cookie_file = dirname(__FILE__) . '/cookie.txt';   
//$cookie_file = tempnam('/tmp');   
$ch = curl_init($login_url);   
curl_setopt($ch, CURLOPT_HEADER, 0);   
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
curl_setopt($ch, CURLOPT_POST, 1);   
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);   
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);   
curl_exec($ch);   
curl_close($ch);   
  
//带着上面得到的COOKIE获取需要登录后才能查看的页面内容   
$ch = curl_init($get_url);   
curl_setopt($ch, CURLOPT_HEADER, 0);   
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);   
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);   
$contents = curl_exec($ch);   
curl_close($ch);   
  
var_dump($contents); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值