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