目录

1、SeasLog日志系统

1.0.seasLog日志系统
1.1.安装方法
1.2.配置方法
1.3.常用方法
1.4.tp集成seaslog

2、PHPExcel拓展

2.1 PHPExcel简介
2.2 PHPExcel导出文件步骤介
2.3 PHPExcel输出到浏览器
2.4 PHPExcel样式设置介
2.5 PHPExcel导入excel

3、cURL

3.1.cURL概念
3.2.cURL使用场景
3.3.cURL操作步骤解析
3.4.cURL实战

4、消息队列

4.1 解耦案例: 订单系统和配送系统
4.2 流量削峰案例: Redis的List(双向列表)类型实现秒杀
4.3 RabbitMQ 专业的队列消息系统

5、Linux crontab定时任务

5.0 linux crontab定时任务的使用
5.1 crontab介绍
5.2 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.3.1 配置方法

1
setBasePath, getBasePath, setLogger, getLastLogger

1.3.2 写日志的方法

1
log, info notice, debug, warning, error

1.3.3 读日志的方法

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 解耦案例: 订单系统和配送系统

mysql订单队列

// 订单系统

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 相关工具

Putty: 一个免费的易用的SSH连接工具
http://www.putty.org/

5.1.1 安装并检查Crontab服务

检查crontab工具是否安装: crontab -l
检查crontab服务是否启动: service crontab status
安装cron yum install vixie-cron yum install crontabs

5.1.2 简单应用

每分钟把当前时间打印到一个日志文件中 crontab -e (打开文件写数据)

tail -f /tmp/log.txt 查看文件最后几行

1
*/1 * * * * date >> /tmp/log.txt

5.1.3 crontab基本组成

配置文件
CTOND
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