生活随笔
收集整理的這篇文章主要介紹了
拓展学习
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
1、SeasLog日志系統(tǒng)
1.0.seasLog日志系統(tǒng)
1.1.安裝方法
1.2.配置方法
1.3.常用方法
1.4.tp集成seaslog
2、PHPExcel拓展
2.1 PHPExcel簡(jiǎn)介
2.2 PHPExcel導(dǎo)出文件步驟介
2.3 PHPExcel輸出到瀏覽器
2.4 PHPExcel樣式設(shè)置介
2.5 PHPExcel導(dǎo)入excel
3、cURL
3.1.cURL概念
3.2.cURL使用場(chǎng)景
3.3.cURL操作步驟解析
3.4.cURL實(shí)戰(zhàn)
4、消息隊(duì)列
4.1 解耦案例: 訂單系統(tǒng)和配送系統(tǒng)
4.2 流量削峰案例: Redis的List(雙向列表)類型實(shí)現(xiàn)秒殺
4.3 RabbitMQ 專業(yè)的隊(duì)列消息系統(tǒng)
5、Linux crontab定時(shí)任務(wù)
5.0 linux crontab定時(shí)任務(wù)的使用
5.1 crontab介紹
5.2 crontab實(shí)踐
1.0.seasLog日志系統(tǒng)
網(wǎng)址: pecl.php.net
1.1.安裝方法
1 2 3 4 5 6 7 8
|
運(yùn)行: phpize // php安裝的路徑 ./configure --with-php-config=/usr/local/php/bin/php-config make && make install 將文件配置到php.ini配置文件當(dāng)中 添加: 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('級(jí)別') 級(jí)別: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簡(jiǎn)介
準(zhǔn)備工具:
php版本 5.3以上
去官網(wǎng)下載PHPExcel,把classes導(dǎo)入工程中
2.2 PHPExcel導(dǎo)出文件步驟
新建excel表格 - 初始化PHPExcel類
創(chuàng)建sheet(內(nèi)置表) - createSheet() setActiveSheetIndex() getActiveSheet()
填充數(shù)據(jù) - setCellValue()
保存文件 - PHPExcel_IOFactory::createWrite() save()
demo.php
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<? php
// 引入 $dir = dirname(__FILE__); // 找到當(dāng)前腳本所在路徑 require $dir."/PHPExcel/PHPExcel.php"; $objPHPExcel = new PHPExcel(); $objSheet = $objPHPExcel -> getActiveSheet(); $objSheet -> setTitle("demo"); $objSheet -> setCellValue("A1","姓名") -> setCellValue("B1","分?jǐn)?shù)"); $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
|
// 數(shù)據(jù)填充的第二種方式 直接加載數(shù)據(jù)塊填充數(shù)據(jù)(不建議使用) $array = array( array(), array("", "姓名", "分?jǐn)?shù)"), array("", "李四", "60"), array("", "王五", "70"), ); $objSheet -> fromArray($array);
|
2.3 從數(shù)據(jù)庫(kù)(Mysql)讀出數(shù)據(jù),用PHPExcel導(dǎo)出文件步驟
將Excel輸出到瀏覽器,主要通過header頭的方式
2.4 PHPExcel樣式設(shè)置
2.4.1 合并單元格 $objSheet -> mergeCells("A2:F2")
2.4.1 文字居中 $objSheet -> getDefaultStyle() -> setVertical(參數(shù))
2.5 PHPExcel導(dǎo)入excel
方式:選擇加載
全部讀取
部分讀取(只加載指定的sheet)
read.php
3.1.cURL概念
使用URL語法傳輸數(shù)據(jù)的命令行工具。
文檔: http://www.php.net/manual/zh/book.curl.php
3.2.cURL使用場(chǎng)景
網(wǎng)頁資源 (編寫網(wǎng)頁爬蟲)
WebService數(shù)據(jù)接口資源 (獲取接口數(shù)據(jù))
FTP服務(wù)器里面的文件資源 (下載/上傳FTP服務(wù)器里面的資源)
其他資源 (所有網(wǎng)絡(luò)資源)
windows 打印所有設(shè)置:php -i
查找cURL,找到則支持
linux: php -i | grep cURL
3.3.cURL操作步驟解析
1.初始化cURL
2.向服務(wù)器發(fā)送請(qǐng)求
3.接收服務(wù)器數(shù)據(jù)
4.關(guān)閉cURL
1 2 3
|
curl_init(); // 1 curl_exec(); // 2-3 curl_close(); // 4
|
3.4.cURL實(shí)戰(zhàn)
執(zhí)行:php -f php文件名 > baidu.html
3.4.1 編寫網(wǎng)頁爬蟲
1 2 3 4 5 6
|
// 抓取百度網(wǎng)頁 <? php $curl = curl_init('http://www.baidu.com'); curl_exec($curl); curl_close($curl); ?>
|
1 2 3 4 5 6 7 8 9 10
|
// 抓取百度網(wǎng)頁,替換部分內(nèi)容 <? php $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL, "http://www.baidu.com"); // 執(zhí)行之后不直接打印出來 true 只是下載 curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($curlobj); curl_close($curlobj); echo str_replace("百度", "測(cè)試", $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, "服務(wù)器地址"); 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 { // 有錯(cuò)誤 echo curl_error($curlobj); } curl_close($curlobj); ?>
|
3.4.3 登錄慕課網(wǎng),并下載個(gè)人空間頁面
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相關(guān)設(shè)置,這部分設(shè)置要在所有會(huì)話開始前設(shè)置 data_default_timezone_set('RPC'); // 設(shè)置時(shí)區(qū) 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支持頁面鏈接跳轉(zhuǎn) 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服務(wù)器中下載一個(gè)文件
1 2 3 4 5 6 < 大專欄 拓展學(xué)習(xí)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 { // 有錯(cuò)誤 echo curl_error($curlobj); } curl_close($curlobj); ?>
|
3.4.5 從本地上傳一個(gè)文件到FTP服務(wù)器中
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 { // 有錯(cuò)誤 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'); // 設(shè)置時(shí)區(qū) curl_setopt($curlobj, CURLOPT_SSL_VERIFYPEER, 0); $output = curl_exec($curlobj); curl_close($curlobj); echo $output;
|
4.1 解耦案例: 訂單系統(tǒng)和配送系統(tǒng)
mysql訂單隊(duì)列
// 訂單系統(tǒng)
1 2 3 4 5 6 7 8
|
// 把訂單信息,存儲(chǔ)到隊(duì)列表中 $insert_data = array( 'order_id' => , 'mobie' => , 'create_at' => date('Y-m-d',timer()), 'status' => 0, // 訂單狀態(tài) ); // 存儲(chǔ)到隊(duì)列表中
|
配送系統(tǒng)
1 2 3 4 5 6 7 8 9 10 11
|
// 1: 先把要處理的記錄更新為等待處理 加鎖 防止其他系統(tǒng)操作 $waiting = array('status' => 0); $lock = array('status' => 2); // 更新為等待處理 數(shù)據(jù)庫(kù)刷選出訂單 // 2: 處理剛鎖定的訂單
// 3: 把這些處理過的更新為已完成 $success = array( 'status' => 1, 'update_at' => 時(shí)間, );
|
1 2 3 4 5 6 7 8
|
// 定時(shí)腳本 good.sh #!/bin/bash
date "+%G-%m-%d %H:%M:S"
cd 目錄
php goods.php
|
4.2 流量削峰案例: Redis的List(雙向列表)類型實(shí)現(xiàn)秒殺
代碼級(jí)設(shè)計(jì)
秒殺程序把請(qǐng)求寫入Redis.(Uid,time_stamp)
檢查Redis已存放數(shù)據(jù)的長(zhǎng)度,超出上限直接丟棄
死循環(huán)處理存入Redis的數(shù)據(jù)庫(kù)
// 數(shù)據(jù)表 (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;
|
接收用戶請(qǐng)求: 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里面已有的數(shù)量 $num = 10; // 當(dāng)人數(shù)少于10 if ($redis -> ILen($redis_name) < 10) { $redis -> rPush($redis_name, $uid.'%'.microtime()); echo $uid.'秒殺成功!';
} else { // 如果人數(shù)達(dá)到十個(gè)人,則返回秒殺已完成 echo $uid.'秒殺已結(jié)束!'; } $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";
// 死循環(huán) while(1) { // 從隊(duì)列最左側(cè)取出一個(gè)值 $user = $redis -> lPush($redis_name); // 然后判斷這個(gè)值是否存在 if ($user || $user == 'nil') { sleep(2); continue; } // 切割時(shí)間,uid $user_arr = explpde('%', $user); $insert_data = array( 'uid' => $user_arr[0], 'time_stamp' => $user_arr[0], ); // 保存到數(shù)據(jù)庫(kù)中 $result = $db -> insert('redis_queue', $insert_data); // 插入失敗,回滾 if (!$result) { $redis -> rPush($redis_name, $user); } }
$redis -> close();
|
4.3 RabbitMQ 專業(yè)的隊(duì)列消息系統(tǒng)
5.0 linux crontab定時(shí)任務(wù)的使用
工作中遇到的困難
每分鐘需要執(zhí)行一個(gè)程序檢查系統(tǒng)的運(yùn)行狀態(tài) (例如nodejs服務(wù)器檢查)
每天凌晨需要對(duì)過去一天的業(yè)務(wù)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)
每個(gè)星期需要把日志文件備份
每個(gè)月需要把數(shù)據(jù)庫(kù)進(jìn)行備份
5.1 crontab介紹
crontab是什么:是一個(gè)用于設(shè)置周期性被執(zhí)行任務(wù)的工具。
5.2 crontab實(shí)踐
5.1.0 相關(guān)工具
Putty: 一個(gè)免費(fèi)的易用的SSH連接工具
http://www.putty.org/
5.1.1 安裝并檢查Crontab服務(wù)
檢查crontab工具是否安裝: crontab -l
檢查crontab服務(wù)是否啟動(dòng): service crontab status
安裝cron yum install vixie-cron yum install crontabs
5.1.2 簡(jiǎn)單應(yīng)用
每分鐘把當(dāng)前時(shí)間打印到一個(gè)日志文件中 crontab -e (打開文件寫數(shù)據(jù))
tail -f /tmp/log.txt 查看文件最后幾行
1
|
*/1 * * * * date >> /tmp/log.txt
|
5.1.3 crontab基本組成
配置文件
CTOND
crontab工具
5.1.4 crontab配置文件的格式
* * * * * COMMAND
* 分鐘:
* * 小時(shí)
* * * 日期 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 # 偶數(shù)分鐘 1-59/2 * * * service httpd restart # 奇數(shù)分鐘
# 5.晚上11點(diǎn)-7點(diǎn)之間,每隔1小時(shí)重啟apache 0 23-7/1 * * * service httpd restart
# 6.每天18點(diǎn)-23點(diǎn)之間,每隔30分鐘重啟apache 0,30 18-23 * * * service httpd restart 0-59/30 18-23 * * * service httpd restart
# 7.每分鐘執(zhí)行兩次 */1 * * * * date >> /temp/log.txt */1 * * * * sleep 30s; date >> /temp/log.txt
|
總結(jié)
以上是生活随笔為你收集整理的拓展学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。