亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ディレクトリ 検索
閱讀前篇 簡(jiǎn)介 Yii 是什么 從 Yii 1.1 升級(jí) 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請(qǐng)求處理 運(yùn)行概述 啟動(dòng)引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請(qǐng)求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯(cuò)誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動(dòng)加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動(dòng)記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯(cuò)誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測(cè)試 概述(Overview) 配置測(cè)試環(huán)境(Testing environment setup) 單元測(cè)試(Unit Tests) 功能測(cè)試(Function Tests) 驗(yàn)收測(cè)試(Acceptance Tests) 測(cè)試夾具(Fixtures) 高級(jí)專題 高級(jí)應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺(tái)命令 核心驗(yàn)證器(Core Validators) 國(guó)際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
テキスト

日志

日志

Yii提供了一個(gè)強(qiáng)大的日志框架,這個(gè)框架具有高度的可定制性和可擴(kuò)展性。使用這個(gè)框架,你可以輕松地記錄各種類型的消息,過濾它們, 并且將它們收集到不同的目標(biāo),諸如文件,數(shù)據(jù)庫,郵件。

使用Yii日志框架涉及下面的幾個(gè)步驟:

  • 在你代碼里的各個(gè)地方記錄?log messages;
  • 在應(yīng)用配置里通過配置?log targets?來過濾和導(dǎo)出日志消息;
  • 檢查由不同的目標(biāo)導(dǎo)出的已過濾的日志消息(例如:Yii debugger)。

在這部分,我們主要描述前兩個(gè)步驟。

日志消息

記錄日志消息就跟調(diào)用下面的日志方法一樣簡(jiǎn)單:

  • Yii::trace():記錄一條消息去跟蹤一段代碼是怎樣運(yùn)行的。這主要在開發(fā)的時(shí)候使用。
  • Yii::info():記錄一條消息來傳達(dá)一些有用的信息。
  • Yii::warning():記錄一個(gè)警告消息用來指示一些已經(jīng)發(fā)生的意外。
  • Yii::error():記錄一個(gè)致命的錯(cuò)誤,這個(gè)錯(cuò)誤應(yīng)該盡快被檢查。

這些日志記錄方法針對(duì)?嚴(yán)重程度?和?類別?來記錄日志消息。 它們共享相同的函數(shù)簽名?function ($message, $category = 'application'),$message代表要被 記錄的日志消息,而?$category?是日志消息的類別。在下面的示例代碼中,在默認(rèn)的類別application?下 記錄了一條跟蹤消息:

Yii::trace('start calculating average revenue');

信息:日志消息可以是字符串,也可以是復(fù)雜的數(shù)據(jù),諸如數(shù)組或者對(duì)象。log targets?的義務(wù)是正確處理日志消息。 默認(rèn)情況下,假如一條日志消息不是一個(gè)字符串,它將被導(dǎo)出為一個(gè)字符串,通過調(diào)用 yii\helpers\VarDumper::export()。

為了更好地組織和過濾日志消息,我們建議您為每個(gè)日志消息指定一個(gè)適當(dāng)?shù)念悇e。 您可以為類別選擇一個(gè)分層命名方案,這將使得?log targets?在基于它們的分類來過濾消息變得更加容易。 一個(gè)簡(jiǎn)單而高效的命名方案是使用PHP魔術(shù)常量?__METHOD__?作為分類名稱。這種方式也在Yii框架的核心代碼中得到應(yīng)用, 例如,

Yii::trace('start calculating average revenue', __METHOD__);

__METHOD__?常量計(jì)算值作為該常量出現(xiàn)的地方的方法名(完全限定的類名前綴)。例如,假如上面那行代碼在這個(gè)方法內(nèi)被調(diào)用,則它將等于字符串?'app\controllers\RevenueController::calculate'。

信息:上面所描述的日志方法實(shí)際上是 yii\log\Logger 對(duì)象(一個(gè)通過表達(dá)式?Yii::getLogger()?可訪問的單例) 的方法 yii\log\Logger::log() 的一個(gè)快捷方式。當(dāng)足夠的消息被記錄或者當(dāng)應(yīng)用結(jié)束時(shí),日志對(duì)象將會(huì)調(diào)用一個(gè) yii\log\Dispatcher 調(diào)度對(duì)象將已經(jīng)記錄的日志消息發(fā)送到已注冊(cè)的?log targets?目標(biāo)中。

日志目標(biāo)

一個(gè)日志目標(biāo)是一個(gè) yii\log\Target 類或者它的子類的實(shí)例。它將通過他們的嚴(yán)重層級(jí)和類別來過濾日志消息,然后將它們導(dǎo)出到一些媒介中。 例如,一個(gè) yii\log\DbTarget 目標(biāo)導(dǎo)出已經(jīng)過濾的日志消息到一個(gè)數(shù)據(jù)的表里面,而一個(gè) yii\log\EmailTarget 目標(biāo)將日志消息導(dǎo)出到指定的郵箱地址里。

在一個(gè)應(yīng)用里,通過配置在應(yīng)用配置里的?log?application component?,你可以注冊(cè)多個(gè)日志目標(biāo)。 就像下面這樣:

return [
    // the "log" component must be loaded during bootstrapping time
    'bootstrap' => ['log'],
    
    'components' => [
        'log' => [
            'targets' => [
                [
                    'class' => 'yii\log\DbTarget',
                    'levels' => ['error', 'warning'],
                ],
                [
                    'class' => 'yii\log\EmailTarget',
                    'levels' => ['error'],
                    'categories' => ['yii\db\*'],
                    'message' => [
                       'from' => ['log@example.com'],
                       'to' => ['admin@example.com', 'developer@example.com'],
                       'subject' => 'Database errors at example.com',
                    ],
                ],
            ],
        ],
    ],
];

注意:log?組件必須在?bootstrapping?期間就被加載,以便于它能夠及時(shí)調(diào)度日志消息到目標(biāo)里。 這是為什么在上面的代碼中,它被列在?bootstrap?數(shù)組中的原因。

在上面的代碼中,在 yii\log\Dispatcher::targets 屬性里有兩個(gè)日志目標(biāo)被注冊(cè):

  • 第一個(gè)目標(biāo)選擇的是錯(cuò)誤和警告層級(jí)的消息,并且在數(shù)據(jù)庫表里保存他們;
  • 第二個(gè)目標(biāo)選擇的是錯(cuò)誤層級(jí)的消息并且是在以?yii\db\?開頭的分類下,并且在一個(gè)郵件里將它們發(fā)送到?admin@example.com?和developer@example.com

Yii配備了以下的內(nèi)建日志目標(biāo)。請(qǐng)參考關(guān)于這些類的API文檔, 并且學(xué)習(xí)怎樣配置和使用他們。

  • yii\log\DbTarget:在數(shù)據(jù)庫表里存儲(chǔ)日志消息。
  • yii\log\EmailTarget:發(fā)送日志消息到預(yù)先指定的郵箱地址。
  • yii\log\FileTarget:保存日志消息到文件中.
  • yii\log\SyslogTarget:通過調(diào)用PHP函數(shù)?syslog()?將日志消息保存到系統(tǒng)日志里。

下面,我們將描述所有日志目標(biāo)的公共特性。

消息過濾

對(duì)于每一個(gè)日志目標(biāo),你可以配置它的 yii\log\Target::levels 和 yii\log\Target::categories 屬性來指定哪個(gè)消息的嚴(yán)重程度和分類目標(biāo)應(yīng)該處理。

yii\log\Target::levels 屬性是由一個(gè)或者若干個(gè)以下值組成的數(shù)組:

  • error:相應(yīng)的消息通過 Yii::error() 被記錄。
  • warning:相應(yīng)的消息通過 Yii::warning() 被記錄。
  • info:相應(yīng)的消息通過 Yii::info() 被記錄。
  • trace:相應(yīng)的消息通過 Yii::trace() 被記錄。
  • profile:相應(yīng)的消息通過 Yii::beginProfile() 和 Yii::endProfile() 被記錄。更多細(xì)節(jié)將在?Profiling?分段解釋。

如果你沒有指定 yii\log\Target::levels 的屬性, 那就意味著目標(biāo)將處理?任何?嚴(yán)重程度的消息。

yii\log\Target::categories 屬性是一個(gè)包含消息分類名稱或者模式的數(shù)組。 一個(gè)目標(biāo)將只處理那些在這個(gè)數(shù)組中能夠找到對(duì)應(yīng)的分類或者其中一個(gè)相匹配的模式的消息。 一個(gè)分類模式是一個(gè)以星號(hào)?*?結(jié)尾的分類名前綴。假如一個(gè)分類名與分類模式具有相同的前綴,那么該分類名將和分類模式相匹配。 例如,yii\db\Command::execute?和?yii\db\Command::query?都是作為分類名稱運(yùn)用在 yii\db\Command 類來記錄日志消息的。 它們都是匹配模式?yii\db\*。

假如你沒有指定 yii\log\Target::categories 屬性,這意味著目標(biāo)將會(huì)處理?任何?分類的消息。

除了通過 yii\log\Target::categories 屬性設(shè)置白名單分類,你也可以通過 yii\log\Target::except 屬性來設(shè)置某些分類作為黑名單。假如一條消息的分類在這個(gè)屬性中被發(fā)現(xiàn)或者是匹配其中一個(gè),那么它將不會(huì)在目標(biāo)中被處理。

在下面的目標(biāo)配置中指明了目標(biāo)應(yīng)該只處理錯(cuò)誤和警告消息,當(dāng)分類的名稱匹配?yii\db\*?或者是?yii\web\HttpException:*?的時(shí)候, 但是除了?yii\web\HttpException:404

[
    'class' => 'yii\log\FileTarget',
    'levels' => ['error', 'warning'],
    'categories' => [
        'yii\db\*',
        'yii\web\HttpException:*',
    ],
    'except' => [
        'yii\web\HttpException:404',
    ],
]

信息:當(dāng)一個(gè)HTTP異常通過?error handler?被捕獲的時(shí)候,一個(gè)錯(cuò)誤消息將以?yii\web\HttpException:ErrorCode?這樣的格式的分類名被記錄下來。例如,yii\web\NotFoundHttpException 將會(huì)引發(fā)一個(gè)分類是?yii\web\HttpException:404?的 錯(cuò)誤消息。

消息格式化

日志目標(biāo)以某種格式導(dǎo)出過濾過的日志消息。例如,假如你安裝一個(gè) yii\log\FileTarget 類的日志目標(biāo), 你應(yīng)該能找出一個(gè)日志消息類似下面的?runtime/log/app.log?文件:

2014-10-04 18:10:15 [::1][][-][trace][yii\base\Module::getModule] Loading module: debug

默認(rèn)情況下,日志消息將被格式化,格式化的方式遵循 yii\log\Target::formatMessage():

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

你可以通過配置 yii\log\Target::prefix 的屬性來自定義格式,這個(gè)屬性是一個(gè)PHP可調(diào)用體返回的自定義消息前綴。 例如,下面的代碼配置了一個(gè)日志目標(biāo)的前綴是每個(gè)日志消息中當(dāng)前用戶的ID(IP地址和Session ID被刪除是由于隱私的原因)。

[
    'class' => 'yii\log\FileTarget',
    'prefix' => function ($message) {
        $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null;
        $userID = $user ? $user->getId(false) : '-';
        return "[$userID]";
    }
]

除了消息前綴以外,日志目標(biāo)也可以追加一些上下文信息到每組日志消息中。 默認(rèn)情況下,這些全局的PHP變量的值被包含在:$_GET,$_POST,?$_FILES,?$_COOKIE,$_SESSION?和?$_SERVER?中。 你可以通過配置 yii\log\Target::logVars 屬性適應(yīng)這個(gè)行為,這個(gè)屬性是你想要通過日志目標(biāo)包含的全局變量名稱。 舉個(gè)例子,下面的日志目標(biāo)配置指明了只有?$_SERVER?變量的值將被追加到日志消息中。

[
    'class' => 'yii\log\FileTarget',
    'logVars' => ['_SERVER'],
]

你可以將?logVars?配置成一個(gè)空數(shù)組來完全禁止上下文信息包含?;蛘呒偃缒阆胍獙?shí)現(xiàn)你自己提供上下文信息的方式, 你可以重寫 yii\log\Target::getContextMessage() 方法。

消息跟蹤級(jí)別

在開發(fā)的時(shí)候,通常希望看到每個(gè)日志消息來自哪里。這個(gè)是能夠被實(shí)現(xiàn)的,通過配置?log?組件的 yii\log\Dispatcher::traceLevel 屬性, 就像下面這樣:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [...],
        ],
    ],
];

上面的應(yīng)用配置設(shè)置了 yii\log\Dispatcher::traceLevel 的層級(jí),假如?YII_DEBUG?開啟則是3,否則是0。 這意味著,假如?YII_DEBUG?開啟,每個(gè)日志消息在日志消息被記錄的時(shí)候,將被追加最多3個(gè)調(diào)用堆棧層級(jí);假如?YII_DEBUG?關(guān)閉, 那么將沒有調(diào)用堆棧信息被包含。

信息:獲得調(diào)用堆棧信息并不是不重要。因此,你應(yīng)該只在開發(fā)或者調(diào)試一個(gè)應(yīng)用的時(shí)候使用這個(gè)特性。

消息刷新和導(dǎo)出

如上所述,通過 yii\log\Logger 對(duì)象,日志消息被保存在一個(gè)數(shù)組里。為了這個(gè)數(shù)組的內(nèi)存消耗, 當(dāng)數(shù)組積累了一定數(shù)量的日志消息,日志對(duì)象每次都將刷新被記錄的消息到?log targets?中。 你可以通過配置?log?組件的 yii\log\Dispatcher::flushInterval 屬性來自定義數(shù)量:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'flushInterval' => 100,   // default is 1000
            'targets' => [...],
        ],
    ],
];

信息:當(dāng)應(yīng)用結(jié)束的時(shí)候,消息刷新也會(huì)發(fā)生,這樣才能確保日志目標(biāo)能夠接收完整的日志消息。

當(dāng) yii\log\Logger 對(duì)象刷新日志消息到?log targets?的時(shí)候,它們并 不能立即獲取導(dǎo)出的消息。相反,消息導(dǎo)出僅僅在一個(gè)日志目標(biāo)累積了一定數(shù)量的過濾消息的時(shí)候才會(huì)發(fā)生。你可以通過配置 個(gè)別的?log targets?的 yii\log\Target::exportInterval 屬性來 自定義這個(gè)數(shù)量,就像下面這樣:

[
    'class' => 'yii\log\FileTarget',
    'exportInterval' => 100,  // default is 1000
]

因?yàn)樗⑿潞蛯?dǎo)出層級(jí)的設(shè)置,默認(rèn)情況下,當(dāng)你調(diào)用?Yii::trace()?或者任何其他的記錄方法,你將不能在日志目標(biāo)中立即看到日志消息。 這對(duì)于一些長(zhǎng)期運(yùn)行的控制臺(tái)應(yīng)用來說可能是一個(gè)問題。為了讓每個(gè)日志消息在日志目標(biāo)中能夠立即出現(xiàn),你應(yīng)該設(shè)置 yii\log\Dispatcher::flushInterval 和 yii\log\Target::exportInterval 都為1, 就像下面這樣:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'flushInterval' => 1,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'exportInterval' => 1,
                ],
            ],
        ],
    ],
];

注意:頻繁的消息刷新和導(dǎo)出將降低你到應(yīng)用性能。

切換日志目標(biāo)

你可以通過配置 yii\log\Target::enabled 屬性來開啟或者禁用日志目標(biāo)。 你可以通過日志目標(biāo)配置去做,或者是在你的代碼中放入下面的PHP申明:

Yii::$app->log->targets['file']->enabled = false;

上面的代碼要求您將目標(biāo)命名為?file,像下面展示的那樣,在?targets?數(shù)組中使用使用字符串鍵:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'targets' => [
                'file' => [
                    'class' => 'yii\log\FileTarget',
                ],
                'db' => [
                    'class' => 'yii\log\DbTarget',
                ],
            ],
        ],
    ],
];

創(chuàng)建新的目標(biāo)

創(chuàng)建一個(gè)新的日志目標(biāo)類非常地簡(jiǎn)單。你主要需要實(shí)現(xiàn) yii\log\Target::export() 方法來發(fā)送 yii\log\Target::messages 數(shù)組的 內(nèi)容到一個(gè)指定的媒體中。你可以調(diào)用 yii\log\Target::formatMessage() 方法去格式化每個(gè)消息。更多細(xì)節(jié),你可以參考任何一個(gè)包含在Yii 發(fā)布版中的日志目標(biāo)類。

性能分析

性能分析是一個(gè)特殊的消息記錄類型,它通常用在測(cè)量某段代碼塊的時(shí)間,并且找出性能瓶頸是什么。舉個(gè)例子,yii\db\Command 類 使用性能分析找出每個(gè)數(shù)據(jù)庫查詢的時(shí)間。

為了使用性能分析,首先確定需要進(jìn)行分析的代碼塊。然后像下面這樣圍住每個(gè)代碼塊:

\Yii::beginProfile('myBenchmark');

...code block being profiled...

\Yii::endProfile('myBenchmark');

這里的?myBenchmark?代表一個(gè)唯一標(biāo)記來標(biāo)識(shí)一個(gè)代碼塊。之后當(dāng)你檢查分析結(jié)果的時(shí)候, 你將使用這個(gè)標(biāo)記來定位對(duì)應(yīng)的代碼塊所花費(fèi)的時(shí)間。

對(duì)于確保?beginProfile?和?endProfile?對(duì)能夠正確地嵌套,這是很重要的。 例如,

\Yii::beginProfile('block1');

    // some code to be profiled

    \Yii::beginProfile('block2');
        // some other code to be profiled
    \Yii::endProfile('block2');

\Yii::endProfile('block1');

假如你漏掉?\Yii::endProfile('block1')?或者切換了?\Yii::endProfile('block1')?和?\Yii::endProfile('block2')?的 順序,那么性能分析將不會(huì)工作。

對(duì)于每個(gè)被分析的代碼塊,一個(gè)帶有嚴(yán)重程度?profile?的日志消息被記錄。你可以配置一個(gè)?log target?去收集這些 消息,并且導(dǎo)出他們。Yii debugger?有一個(gè)內(nèi)建的性能分析面板能夠展示分析結(jié)果。
前の記事: 次の記事: