欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 综合教程 >内容正文

综合教程

拓展学习

发布时间:2023/12/24 综合教程 53 生活家
生活随笔 收集整理的这篇文章主要介绍了 拓展学习 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录

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

总结

以上是生活随笔为你收集整理的拓展学习的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。