目录
1、SeasLog日志系统
2、PHPExcel拓展
3、cURL
4、消息队列
5、Linux crontab定时任务
1.0.seasLog日志系统
网址: pecl.php.net
1.1.安装方法
1 2 3 4 5 6 7 8
| 运行: phpize // php安装的路径 ./configure --with-php-config=/usr/local/php/bin/php-config make && make install 将文件配置到php.ini配置文件当中 添加: extension = "seaslog.so"
|
1.2.配置方法 可以参考github seaslog
将配置拷贝到 php.ini文件中
1.3.常用方法
1
| setBasePath, getBasePath, setLogger, getLastLogger
|
1
| log, info notice, debug, warning, error
|
1
| analyzerCount, analyzerDetail('级别') 级别:info、notice...
|
使用:
1 2 3 4 5 6 7 8
| SeasLog::setBasePath('/home/wwwroot/default/seaslog/log'); echo SeasLog::getBasePath();
// 分模块 SeasLog::setLogger('Web'); SeasLog::setLogger('Api'); SeasLog::debug('It is debug info'); SeasLog::info('It is info');
|
1.4.tp集成seaslog
tp中Log.class.php
日志管理类
2.1 PHPExcel简介
准备工具:
php版本 5.3以上
去官网下载PHPExcel,把classes导入工程中
2.2 PHPExcel导出文件步骤
- 新建excel表格 - 初始化PHPExcel类
- 创建sheet(内置表) - createSheet() setActiveSheetIndex() getActiveSheet()
- 填充数据 - setCellValue()
- 保存文件 - PHPExcel_IOFactory::createWrite() save()
demo.php
1 2 3 4 5 6 7 8 9 10 11 12 13
| <? php
// 引入 $dir = dirname(__FILE__); // 找到当前脚本所在路径 require $dir."/PHPExcel/PHPExcel.php"; $objPHPExcel = new PHPExcel(); $objSheet = $objPHPExcel -> getActiveSheet(); $objSheet -> setTitle("demo"); $objSheet -> setCellValue("A1","姓名") -> setCellValue("B1","分数"); $objSheet -> setCellValue("A2","张三") -> setCellValue("B2","50") ; $objWriter = PHPExcel_IOFactory::createWrite($objPHPExcel,"Excel2007"); $objWriter -> save($dir."/demo.xlsx"); ?>
|
1 2 3 4 5 6 7 8
| // 数据填充的第二种方式 直接加载数据块填充数据(不建议使用) $array = array( array(), array("", "姓名", "分数"), array("", "李四", "60"), array("", "王五", "70"), ); $objSheet -> fromArray($array);
|
2.3 从数据库(Mysql)读出数据,用PHPExcel导出文件步骤
将Excel输出到浏览器,主要通过header头的方式
2.4 PHPExcel样式设置
2.4.1 合并单元格 $objSheet -> mergeCells("A2:F2")
2.4.1 文字居中 $objSheet -> getDefaultStyle() -> setVertical(参数)
2.5 PHPExcel导入excel
方式:选择加载
- 全部读取
- 部分读取(只加载指定的sheet)
read.php
3.1.cURL概念
使用URL语法传输数据的命令行工具。
文档: http://www.php.net/manual/zh/book.curl.php
3.2.cURL使用场景
- 网页资源 (编写网页爬虫)
- WebService数据接口资源 (获取接口数据)
- FTP服务器里面的文件资源 (下载/上传FTP服务器里面的资源)
- 其他资源 (所有网络资源)
windows 打印所有设置:php -i
查找cURL
,找到则支持
linux: php -i | grep cURL
3.3.cURL操作步骤解析
- 1.初始化cURL
- 2.向服务器发送请求
- 3.接收服务器数据
4.关闭cURL
1 2 3
| curl_init(); // 1 curl_exec(); // 2-3 curl_close(); // 4
|
3.4.cURL实战
执行:php -f php文件名 > baidu.html
3.4.1 编写网页爬虫
1 2 3 4 5 6
| // 抓取百度网页 <? php $curl = curl_init('http://www.baidu.com'); curl_exec($curl); curl_close($curl); ?>
|
1 2 3 4 5 6 7 8 9 10
| // 抓取百度网页,替换部分内容 <? php $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL, "http://www.baidu.com"); // 执行之后不直接打印出来 true 只是下载 curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($curlobj); curl_close($curlobj); echo str_replace("百度", "测试", $output); ?>
|
3.4.2 获取Webservice上的天气信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <? php $data = 'theCityName=北京'; $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL, "服务器地址"); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlobj, CURLOPT_POST, 1); curl_setopt($curlobj, CURLOPT_POSTFILELES, $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); echo $rtn; } else { // 有错误 echo curl_error($curlobj); } curl_close($curlobj); ?>
|
3.4.3 登录慕课网,并下载个人空间页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <? php $data = 'username=demo_peter@126.com&password=123qwe&remember=1'; $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL,"http://www.imooc.com/user/login"); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); // Cookie相关设置,这部分设置要在所有会话开始前设置 data_default_timezone_set('RPC'); // 设置时区 curl_setopt($curlobj, CURLOPT_COOKIESESSION, TRUE); curl_setopt($curlobj, CURLOPT_COOKIEFILE, 'cookiefile); curl_setopt($curlobj, CURLOPT_COOKIEJAR, 'cookiefile'); curl_setopt($curlobj, CURLOPT_COOKIE, session_name(). '='. session_id() ); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_setopt($curlobj, CURLOPT_FOLLOWLCATION, 1); // 让cURL支持页面链接跳转 curl_setopt($curlobj, CURLOPT_POST, 1); curl_setopt($curlobj, CURLOPT_POSTFILELES, $data); curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded;charset=utf-8", "Content-length:".strlen($data))); curl_exec($curlobj); curl_setopt($curlobj, CURLOPT_URL, "http://www.imooc.com/space/index"); curl_setopt($curlobj, CURLOPT_POST, 0); curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("Content-type: text/xml")); $output = curl_exec($curlobj); curl_close($curlobj); echo $output
?>
|
3.4.4 从FTP服务器中下载一个文件
1 2 3 4 5 6 < 大专栏 拓展学习span class="line">7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <? php $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL, "ftp://192.168.1.100/downloaddemo.txt"); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlobj, CURLOPT_TIMEOUT, 300); curl_setopt($curlobj, CURLOPT_USERPWD, "peter.zhou:123456"); // FTP用户名和密码 $outfile = fopen('dest.txt', 'wb'); // 保存到本地的文件名 curl_setopt($curlobj, CURLOPT_FILE, $outfile); $rtn = curl_exec($curlobj); fclose($outfile); if (!curl_errno($curlobj)) { // $info = curl_getinfo($curlobj); echo $rtn; } else { // 有错误 echo curl_error($curlobj); } curl_close($curlobj); ?>
|
3.4.5 从本地上传一个文件到FTP服务器中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <? php $curlobj = curl_init(); $localfile = 'ftp01.php'; $fp = fopen($localfile, 'r'); curl_setopt($curlobj, CURLOPT_URL, "ftp://192.168.1.100/downloaddemo.txt"); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlobj, CURLOPT_TIMEOUT, 300); curl_setopt($curlobj, CURLOPT_USERPWD, "peter.zhou:123456"); // 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)) { // $info = curl_getinfo($curlobj); echo $rtn; } else { // 有错误 echo curl_error($curlobj); } curl_close($curlobj); ?>
|
3.4.6 下载HTTPS资源
1 2 3 4 5 6 7 8
| $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL, "ftp://192.168.1.100/downloaddemo.txt"); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); data_default_timezone_set('RPC'); // 设置时区 curl_setopt($curlobj, CURLOPT_SSL_VERIFYPEER, 0); $output = curl_exec($curlobj); curl_close($curlobj); echo $output;
|
4.1 解耦案例: 订单系统和配送系统
// 订单系统
1 2 3 4 5 6 7 8
| // 把订单信息,存储到队列表中 $insert_data = array( 'order_id' => , 'mobie' => , 'create_at' => date('Y-m-d',timer()), 'status' => 0, // 订单状态 ); // 存储到队列表中
|
配送系统
1 2 3 4 5 6 7 8 9 10 11
| // 1: 先把要处理的记录更新为等待处理 加锁 防止其他系统操作 $waiting = array('status' => 0); $lock = array('status' => 2); // 更新为等待处理 数据库刷选出订单 // 2: 处理刚锁定的订单
// 3: 把这些处理过的更新为已完成 $success = array( 'status' => 1, 'update_at' => 时间, );
|
1 2 3 4 5 6 7 8
| // 定时脚本 good.sh #!/bin/bash
date "+%G-%m-%d %H:%M:S"
cd 目录
php goods.php
|
4.2 流量削峰案例: Redis的List(双向列表)类型实现秒杀
代码级设计
- 秒杀程序把请求写入Redis.(Uid,time_stamp)
- 检查Redis已存放数据的长度,超出上限直接丢弃
- 死循环处理存入Redis的数据库
// 数据表 (time_stamp 微秒)
1 2 3 4 5 6
| create table `redis_queue`( id int(11) unsigned not null auto_increment, uid int(11) not null default '0', time_stamp varchar(24) not null, primary key(id) )engine=InnoDB default charset=utf8;
|
接收用户请求: user.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // 1.加载redis组件 $redis = new Redis(); $redis -> connect('127.0.0.1',6379); $redis_name = "miaosha";
// 接受用户的uid $uid = $_GET('uid'); // 获取redis里面已有的数量 $num = 10; // 当人数少于10 if ($redis -> ILen($redis_name) < 10) { $redis -> rPush($redis_name, $uid.'%'.microtime()); echo $uid.'秒杀成功!';
} else { // 如果人数达到十个人,则返回秒杀已完成 echo $uid.'秒杀已结束!'; } $redis -> close();
|
// 处理程序 savetodb.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| // 1.加载redis组件 $redis = new Redis(); $redis -> connect('127.0.0.1',6379); $redis_name = "miaosha";
// 死循环 while(1) { // 从队列最左侧取出一个值 $user = $redis -> lPush($redis_name); // 然后判断这个值是否存在 if ($user || $user == 'nil') { sleep(2); continue; } // 切割时间,uid $user_arr = explpde('%', $user); $insert_data = array( 'uid' => $user_arr[0], 'time_stamp' => $user_arr[0], ); // 保存到数据库中 $result = $db -> insert('redis_queue', $insert_data); // 插入失败,回滚 if (!$result) { $redis -> rPush($redis_name, $user); } }
$redis -> close();
|
4.3 RabbitMQ 专业的队列消息系统
5.0 linux crontab定时任务的使用
工作中遇到的困难
- 每分钟需要执行一个程序检查系统的运行状态 (例如nodejs服务器检查)
- 每天凌晨需要对过去一天的业务数据进行统计
- 每个星期需要把日志文件备份
- 每个月需要把数据库进行备份
5.1 crontab介绍
crontab是什么:是一个用于设置周期性被执行任务的工具。
5.2 crontab实践
5.1.0 相关工具
5.1.1 安装并检查Crontab服务
- 检查crontab工具是否安装:
crontab -l
- 检查crontab服务是否启动:
service crontab status
- 安装cron
yum install vixie-cron
yum install crontabs
5.1.2 简单应用
5.1.3 crontab基本组成
5.1.4 crontab配置文件的格式
* * * * * COMMAND
* 分钟:
* * 小时
* * * 日期 1~31
* * * * 月份 1 ~ 12
* * * * * 星期 0 ~ 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| # 1. 每晚21:30 重启Apache 30 21 * * * service httpd restart
# 2.每月1、10、22日的4: 45重启Apache 45 4 1,10,22 * * service httpd restart
# 3.每月1-10日的4:45重启apache 45 4 1-10 * * service httpd restart
# 4.每隔2分钟重启apache */2 * * * service httpd restart # 偶数分钟 1-59/2 * * * service httpd restart # 奇数分钟
# 5.晚上11点-7点之间,每隔1小时重启apache 0 23-7/1 * * * service httpd restart
# 6.每天18点-23点之间,每隔30分钟重启apache 0,30 18-23 * * * service httpd restart 0-59/30 18-23 * * * service httpd restart
# 7.每分钟执行两次 */1 * * * * date >> /temp/log.txt */1 * * * * sleep 30s; date >> /temp/log.txt
|