• 拓展学习


    目录

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

    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
  • 相关阅读:
    不要跟亲戚谈生意
    docker学习连接
    docker之docker-compose——容器管理
    docker之镜像管理——仓库使用
    docker之入门——安装及基本命令
    orcle数据库新建用户
    hibernate select 查询方式总结
    Hibernate 主配置文件详解
    ActionContext和ServletActionContext小结(struts2)
    理解Java常量池
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12389657.html
Copyright © 2020-2023  润新知