生活随笔
收集整理的這篇文章主要介紹了
拓展学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
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
|
總結
以上是生活随笔為你收集整理的拓展学习的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。