imooc慕课 PHP中的数据传输神器cURL 笔记

1.cURL 使用URL语法传输数据的命令行工具

2.在phpinfo中查看php是否支持cURL,不支持的话安装curl扩展,最好先安装ssl扩展,这样好配置cURL支持ssl 可以支持https协议

3.cURL的概念

4.使用场景
网页资源 --编写网页爬虫
WebService数据接口资源 --动态获取接口数据,比如天气、号码归属地等
FTP服务器里面的文件资源 --下载FTP服务器里的文件
其他资源 --所有网络上的资源都可以用cURL访问和下载到

5.在PHP中使用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、用户名+密码的认证。

6.用cURL做一个简单的网页爬虫

//抓取百度首页
$c=curl_init('http://www.baidu.com'); 
curl_exec($c);
curl_close($c);
//抓取百度首页 并且对其内容进行替换
$curl_obj = curl_init();  //初始化
curl_setopt($curl_obj,CURLOPT_URL,"http://www.baidu.com/");  //设置访问的网页
curl_setopt($curl_obj,CURLOPT_RETURNTRANSFER,true); //设置执行后不打印出来
$output = curl_exec($curl_obj);  //执行将结果返回给变量
// ps:官方文档对curl_exec的说明,成功时返回 TRUE, 或者在失败时返回 FALSE。 然而,如果 设置了 CURLOPT_RETURNTRANSFER 选项,函数执行成功时会返回执行的结果,失败时返回 FALSE 。
curl_close($curl_obj);  //关闭
echo str_replace('百度','360',$output);  //替换内容

7.用cURL调用接口 ps:主要调用post接口

//获取天气
$data = 'theCityName=长沙';
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_URL, "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName");
curl_setopt($curlobj, CURLOPT_HEADER, 0);  //不返回头
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curlobj, CURLOPT_POST, 1);  //post
curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data);   //post的内容
curl_setopt($curlobj, CURLOPT_USERAGENT, "user-agent:Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Firefox/24.0");  //需要设置这个 否则返回 未将对象引用设置到对象的实例
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8",
    "Content-length: ".strlen($data)
));  //设置http头

//ps:可以用curl_setopt_array批量设置参数$options = array(CURLOPT_URL => 'http://www.example.com/',CURLOPT_HEADER => false);curl_setopt_array($ch, $options);

$rtn = curl_exec($curlobj);
if(!curl_errno($curlobj)){
// $info = curl_getinfo($curlobj);
// print_r($info);
    echo $rtn;
} else {
    echo 'Curl error: ' . curl_error($curlobj);
}
curl_close($curlobj);
//ip接口
$data = 'ip=118.249.120.10';
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_URL, "http://ip.taobao.com//service/getIpInfo.php");
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlobj, CURLOPT_POST, 1);  //开启post
curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data);
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8",
    "Content-length: ".strlen($data)
));
$rtn = curl_exec($curlobj);
if(!curl_errno($curlobj)){  //是否有错误
    // $info = curl_getinfo($curlobj);
    // print_r($info);
    echo $rtn;
} else {
    echo 'Curl error: ' . curl_error($curlobj);
}
curl_close($curlobj);

8.用cURL操作FTP服务器中的数据

//用cURL给FTP服务器下载文件
/*自己搭了ftp 允许匿名 匿名下成功*/
$curlobj = curl_init();
curl_setopt($curlobj, CURLOPT_URL, "ftp://192.168.0.104/pub/test.txt");
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlobj, CURLOPT_TIMEOUT, 300); // times out after 300s 超时时间
curl_setopt($curlobj, CURLOPT_USERPWD, "ftptest:123456");//FTP用户名:密码
// Sets up the output file
$outfile = fopen('test.txt', 'wb');//保存到本地的文件名
curl_setopt($curlobj, CURLOPT_FILE, $outfile);

$rtn = curl_exec($curlobj);
fclose($outfile);
if(!curl_errno($curlobj)){
    // $info = curl_getinfo($curlobj);
    // print_r($info);
    echo "RETURN: " . $rtn;
} else {
    echo 'Curl error: ' . curl_error($curlobj);
}
curl_close($curlobj);
//上传文件 ps:没成功 我设置的linux下的FTP服务器有问题
$curlobj = curl_init();
$localfile = 'test.txt';
$fp = fopen($localfile, 'r');

curl_setopt($curlobj, CURLOPT_URL, "ftp://192.168.0.104/pub/text1.txt");
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlobj, CURLOPT_TIMEOUT, 300); // times out after 300s
curl_setopt($curlobj, CURLOPT_USERPWD, "ftptest:ftp123456");//FTP用户名:密码

curl_setopt($curlobj, CURLOPT_UPLOAD, 1);  //开启上传
curl_setopt($curlobj, CURLOPT_INFILE, $fp);  //上传的文件
curl_setopt($curlobj, CURLOPT_INFILESIZE, filesize($localfile));  //传的大小

$rtn = curl_exec($curlobj);
fclose($fp);
if(!curl_errno($curlobj)){
    echo "Uploaded successfully.";
} else {
    echo 'Curl error: ' . curl_error($curlobj);
}
curl_close($curlobj);

9.用cURL访问HTTPS资源 ps:需要curl支持ssl 在phpinfo中看curl是否支持ssl 用ldconfig更新配置 要不没生效 这里后来不知怎么就成功了 应该是ldconfig起作用了

$curlobj = curl_init();			// 初始化
curl_setopt($curlobj, CURLOPT_URL, "https://ajax.aspnetcdn.com/ajax/jquery.validate/1.12.0/jquery.validate.js");		// 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);			// 执行之后不直接打印出来

// 设置HTTPS支持
date_default_timezone_set('PRC'); // 使用Cookie时,必须先设置时区
curl_setopt($curlobj, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查从证书中检查

$output=curl_exec($curlobj);	// 执行
if(!curl_errno($curlobj)){
    echo "Uploaded successfully.";
} else {
    echo 'Curl error: ' . curl_error($curlobj);
}
curl_close($curlobj);			// 关闭cURL
echo $output;

10.php中curl官方文档地址 http://be2.php.net/manual/zh/book.curl.php
其中关于那些选项设置的详细参数在 curl_setopt — 设置 cURL 传输选项 函数中 http://be2.php.net/manual/zh/function.curl-setopt.php