lampabc.com,lamp学习本应更简单, 互帮 互助 共享 ~~~

curl 使用


PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。

也即是PHP通过CURL 可以模仿浏览器POST、GET等请求,也可以做为一个简单的telnet、FTP客户端等;几乎包括了WEB常用的场景,功能丰富,可以实现一些特殊的有用的功能。

先给出一个CURL最基础的示例,简单获取一个网页内容:

<?php 
        // 初始化一个curl资源
        $ch = curl_init(); 
        // 设置curl参数:请求地址
        curl_setopt($ch, CURLOPT_URL, "http://www.example.com"); 
        // 设置curl参数:以字符串形式返回请求结果
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        // 执行请求
        $output = curl_exec($ch); 
        // 关闭curl资源
        curl_close($ch);      
?>

由上可得操作CURL步骤为:

1.初始化,创建一个cURL资源
2.设置URL和相应的选项
3.执行请求,并返回结果
4.关闭cURL资源,并且释放系统资源

1,4 为初始化和关闭资源,3为执行;也即是CURL的强大都体现在了第2个步骤,而也确实,curl有很多的设置选项,可以实现非常丰富的功能。


下面以示例的方式,说明一些的选项的使用。

1,判断远程文件/链接是否存在/有效

$url = 'http://www.example.com/XXX';
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

$contents = curl_exec($ch);
if (preg_match("/404/", $contents) || empty($contents) ){
	echo '不存在';
} else {
	echo '存在';
}


2,远程提交请求数据

<?php
$url = "http://www.example.com/xxx";
$post_data = array (
    "username" => "jack",
    "password" => "123456"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);// 模仿POST请求
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); //POST一个数据
$output = curl_exec($ch);
curl_close($ch);
var_dump($output);
?>


3,HTTPS 站点的登录验证

<?php 
$submit_url = "https://sitename/process.php"; 
$params = array(
	// ...
	);
$curl = curl_init(); 

curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ; 
curl_setopt($curl, CURLOPT_USERPWD, "username:password"); // 用户名和密码
curl_setopt($curl, CURLOPT_SSLVERSION,3); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($curl, CURLOPT_HEADER, true); 
curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $params ); // 提交数据
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); 
curl_setopt($curl, CURLOPT_URL, $submit_url); 

$data = split("text/html", curl_exec($curl) ); 
$temp = split("\r\n", $data[1]) ; 

$result = unserialize( $temp[2] ) ; 

print_r($result); 
curl_close($curl); 
?>


4,实现上传文件

<?php
// 模拟浏览器上传
/* http://localhost/upload.php:
print_r($_POST);
print_r($_FILES);
*/

$ch = curl_init();
$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');

curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
?>
<?php
// 通过FTP方式上传文件
$file = fopen("/path/ori_file", "r");
$url = "ftp://username:password@example.com:21/path/dst_file";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1); // 启用文件上传
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/ori_file"));
curl_setopt($ch, CURLOPT_FTPASCII, 1);
$output = curl_exec($ch);
curl_close($ch);
?>
暂时列出以上这些;curl还可以实现如:HTTP代理、SESSION COOKIE处理、回调函数、curl批处理等;更多丰富的功能,可以到官网查看具体的设置项。