我負責乙個基於yii的lamp站點維護和優化,其中有乙個表的併發寫很高,導致使用者體驗差,甚至寫失敗造成資料丟失,分析後發現這個表其實併發讀要求很低,所以計畫將寫記錄到log中,定期將log寫入mysql。
log4php在yii中使用
<?php
return
array(
'rootlogger' => array(
),'default' => array(
'layout' => array(
'class' => 'loggerlayout******'
),'params' => array(
'datepattern' => 'y-m-d.h',
'file' => './history_log/history-%s.log',))
));
很簡單吧,當然,要在yii的index.php中對庫引用:
// history_log
$log4php=dirname(__file__).'/log4php/logger.php';
$log4phpconfig=dirname(__file__).'/log4php/config.php';
require_once($log4php);
logger::configure($log4phpconfig);
使用上,在業務處舉個栗子:
logger::getrootlogger()->info(json_encode($item));
這樣,資料就記錄在日誌中,舉個栗子:
週期將log寫入資料庫
我使用shell和yii的commands支援相結合來做定期指令碼,意識流,為了省事。
shell來獲取時間並呼叫yii command:
logtime=$(
date --date='1 hour ago' +%y-%m-%d.%h)
/home/qec/qss/www/protected/yiic updatehistory $logtime
yii php用來讀log,寫mysql,乙個繼承yii的cconsolecommand類就好:
class
updatehistorycommand
extends
cconsolecommand
public
function
run($args)
$logtime = $args[0];
$logfilename = 'history-'.$logtime.'.log';
echo
"logfilename: ",$logfilename,"\n";
echo
self::logpath.$logfilename,"\n";
$path= self::logpath.$logfilename;
$logfd = fopen($path, 'r');
if($logfd == 0)
$this->addlogtohistory($logfd);
}...
最後,crontab裡面加入定時任務:
5 * * * * source /home/qec/.bash_profile;cd /home/qec/qss/www/protected/commands; sh hourlyjobs.sh >> ../runtime/hourlyjobs.log
就可以了。
ps:第一次使用markdown,感覺不錯。
設計乙個高併發系統
公升級過程為 最初系統 新增負載均衡 資料庫分庫分表 讀寫分離 快取集群 訊息中介軟體集群 假設系統機器是4核8g,資料庫伺服器是16核32g。日活使用者1w,系統層面每秒10次請求,資料庫層每秒30次請求。使用者量增長了50倍,日活使用者50萬,高峰期對系統每秒請求500 s,對資料庫的每秒請求1...
如何設計乙個高併發系統
總結如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官也絕對不會這樣來問你,否則他就是蠢。假設你在某知名電商公司幹過高併發系統,使用者上億,一天流量幾十億,高峰期併發量上萬,甚至是十萬。那麼人家一定會仔細盤問你的系統架構,你們系統啥架構?怎...
如何設計乙個高併發系統
系統拆分,將乙個系統拆分為多個子系統,用dubbo來搞。然後每個系統連乙個資料庫,這樣本來就乙個庫,現在多個資料庫,不也可以抗高併發麼。快取,必須得用快取。大部分的高併發場景,都是讀多寫少,那你完全可以在資料庫和快取裡都寫乙份,然後讀的時候大量走快取不就得了。畢竟人家redis輕輕鬆鬆單機幾萬的併發...