今天我們來完成一個新的功能,這個功能是所有框架中必不可少的功能——日誌類,日誌類和其他的類有
一定的區別,因爲日誌有可能存儲在文件中,有可能存儲在數據庫中,也甚至存在緩存當中,所以我們在
完成日誌類的時候需要用到一種新的設計模式。這裏我們實現的是文件存儲
具體實現如下:
首先在lib目錄下新建一個log.php
<?php
namespace core\lib;
class log
{
static $class;
/**
* 1.確定日誌的存儲方式
* 2.寫日誌
*/
static public function init(){
//確定存儲方式
$drive = conf::get('DRIVE','log');
$class = '\core\lib\drive\log\\'.$drive;
self::$class = new $class;
}
static public function log($name,$file = 'log'){
self::$class->log($name,$file);
}
}
然後創建一個驅動文件夾,在lib下新建一個drive目錄,然後我們在drive下創建一個專門存儲日誌驅動的log目錄,如果我們將日誌存儲在文件中,就在log目錄下創建一個file.php,如果將日誌存儲在數據庫
中,我們就相應的在log目錄下創建一個mysql.php,這裏我們主要演示的是將日誌存儲在文件中。
file.php
<?php
namespace core\lib\drive\log;
use core\lib\conf;
class file
{
public $path; //日誌的存儲位置
public function __construct(){
$conf = conf::get('OPTION','log');
$this->path = $conf['PATH'];
}
public function log($message,$file = 'log'){
/**
* 1.確定文件的存儲位置是否存在
* 2.寫入日誌
*/
if(!is_dir($this->path.date('YmdH'))){
mkdir($this->path.date('YmdH'),'0777',true); //這裏我們一定要注意給權限
}
return file_put_contents($this->path.date('YmdH').'/'.$file.'.php',date('Y-m-d
H:i:s').json_encode($message).PHP_EOL,FILE_APPEND);
//PHP_EOL 主要是自動換行的作用,讓我們的日誌文件更好看一點
//FILE_APPEND 如果是多條日誌的話可以將日誌依次追加到文件後面,否則的話只會追加一條日
志
//如果併發量大的時候我們的日誌文件就會特別的大,上面操作的目的是一個小時生成一個文件
}
}
if(is_file($ctrlfile)){
include $ctrlfile;
$ctrl = new $cltrlClass();
$ctrl->$action();
\core\lib\log::log('ctrl:'.$ctrlClass.' '.'action:'.$action);
}else{
throw new \Exception('找不到控制器'.$ctrlClass);
}
這樣我們的日誌類就完成了,下面是生成的日誌文件的內容
2016-10-03 20:09:49"ctrl:index action:index"