# 調試器
Tracy調試器是PHP程序員的有用幫助提示。 它可以幫助程序員很完成以下幾點:
* 快速檢測和糾正錯誤
* 日志錯誤
* 轉儲變量
* 測量腳本/查詢的執行時間
* 內存消耗
## 安裝和要求
如何安裝Tracy的最好方法是下載最新的軟件包或使用Composer:
~~~
php composer.phar require tracy/tracy
~~~
Tracy需要PHP 5.3.0或更高版本。
**我們下載安裝包時就已自帶了tracy**
## 用法
激活Tracy很容易。 只需添加這兩行代碼,最好只是加載庫(使用require'src / tracy.php'或通過Composer):
~~~
use Tracy\Debugger;
Debugger::enable();
~~~
Tracy一開始是打開的。所以我們開發時打開網站都會看到一個調試器,所以我們不用個修改什么。
## 調試器
調試器欄是一個浮動面板。 它一開始就顯示在頁面的右下角。 您可以使用鼠標移動它。 它會記住它在頁面重新加載后的位置。

您可以將其他有用的面板添加到調試器欄中。 你可以在插件中找到有趣的,或者你可以創建自己的面板加入進去。
一般我們就不加了。原有的夠用了!
## 可視化的錯誤和異常
當然,你知道PHP如何報告錯誤:頁面中有這樣的源代碼:
~~~
Parse error: syntax error, unexpected '}' in HomepagePresenter.php on line 15
~~~
或未捕獲異常:
~~~
Fatal error: Uncaught Nette\MemberAccessException: Call to undefined method Nette\Application\UI\Form::addTest()? in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php:100
Stack trace:
#0 /sandbox/vendor/nette/utils/src/Utils/Object.php(75): Nette\Utils\ObjectMixin::call(Object(Nette\Application\UI\Form), 'addTest', Array)
#1 /sandbox/app/forms/SignFormFactory.php(32): Nette\Object->__call('addTest', Array)
#2 /sandbox/app/presenters/SignPresenter.php(21): App\Forms\SignFormFactory->create()
#3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presenters\SignPresenter->createComponentSignInForm('signInForm')
#4 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(139): Nette\ComponentModel\Container->createComponent('signInForm')
#5 /sandbox/temp/cache/latte/15206b353f351f6bfca2c36cc.php(17): Nette\ComponentModel\Co in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php on line 100
~~~
這個輸出不是那么容易瀏覽理解。 如果啟用Tracy,則錯誤和異常都以完全不同的形式顯示:

錯誤消息字面上加提示性顯示。 您可以看到源代碼的一部分,其中出現錯誤的突出顯示的行。 消息清楚地解釋了錯誤。 整個網站是互動的,你可以試試。
這前的博客實例已試過,大家不明白可以回頭看一下。
你知道嗎? 致命錯誤以相同的方式捕獲和顯示。 無需安裝任何擴展(點擊即時示例):

錯誤(如變量名稱中的打字錯誤或嘗試打開不存在的文件)會生成E_NOTICE或E_WARNING級別的報告。 這些可以容易地被忽略和/或可以完全隱藏在網頁圖形布局中。 讓Tracy管理他們:

或者它們可能顯示為錯誤:
~~~
Debugger::$strictMode = TRUE;
~~~

## 生產模式和錯誤日志記錄
正如你所看到的,Tracy在開發環境中是相當有說服力的。 但是在生產服務器上它會引起災難。 任何調試信息都不能在那里列出。 因此,Tracy具有環境自動檢測和日志功能。 Tracy不會顯示自己,而是將信息存儲到日志文件中,并向訪問者顯示用戶可理解的服務器錯誤消息:

生產輸出模式抑制通過Debugger :: dump()或Debugger :: fireLog()發送的所有調試信息,當然還包括PHP生成的所有錯誤消息。所以,即使你在源代碼中忘記了Debugger :: dump($ obj),你也不必擔心它在你的生產服務器上顯示出來。
輸出模式由Debugger :: enable()的第一個參數設置。您可以指定常數Debugger :: PRODUCTION或Debugger :: DEVELOPMENT。其他選項是以一種方式設置它,當應用程序從定義的IP地址訪問具有定義的tracy-debug cookie值時,開發模式將打開。用于實現這一點的語法是cookie-value @ ip-address。
如果未指定,則使用缺省值Debugger :: DETECT。在這種情況下,系統通過IP地址檢測服務??器。如果通過公共IP地址訪問應用程序,則選擇生產模式。本地IP地址導致開發模式。在大多數情況下不需要設置模式。在本地服務器或生產環境中啟動應用程序時,會正確識別模式。
在生產模式下,Tracy會自動將所有錯誤和異常捕獲到文本日志中。除非另有說明,否則它將存儲在log / error.log中。此錯誤日志記錄非常有用。想象一下,你的應用程序的所有用戶實際上是betatesters。他們在狩獵蟲時自由地做最前沿的工作,如果你把他們有價值的報告丟到一個沒有注意到的回收站,你會很蠢。
如果您需要記錄自己的消息或捕獲異常,請使用方法log():
~~~
Debugger::log('Unexpected error'); // 短信息
try {
criticalOperation();
} catch (Exception $e) {
Debugger::log($e); //日志異常
// 或者
Debugger::log($e, Debugger::ERROR) // 還會發送電子郵件通知
}
~~~
可以通過enable()方法的第二個參數設置錯誤日志記錄的目錄:
~~~
Debugger::enable(Debugger::DETECT, __DIR__ . '/mylog');
~~~
如果希望Tracy使用詳細信息(HTML報告)記錄類似E_NOTICE或E_WARNING的PHP錯誤,請設置Debugger :: $ logSeverity:
~~~
Debugger::$logSeverity = E_NOTICE | E_WARNING;
~~~
對于一個真正的專業人士,錯誤日志是一個重要的信息來源,他或她想立即被通知任何新的錯誤。 Tracy幫助他。 她能夠為每個新的錯誤記錄發送電子郵件。 變量$ email標識發送這些電子郵件的位置:
~~~
Debugger::$email = 'admin@example.com';
~~~
為了防止您的電子郵件箱泛洪,Tracy只發送一條消息,并創建一個電子郵件發送的文件。 當開發人員收到電子郵件通知時,他檢查日志,更正他的應用程序并刪除電子郵件發送的監控文件。 這將再次激活電子郵件發送。
## 變量傾銷
每個調試開發人員都是一個很好的朋友,函數var_dump詳細列出了任何變量的所有內容。 不幸的是,它的輸出沒有HTML格式化,并將轉儲輸出到一行HTML代碼,更不用說上下文轉義。 有必要用一個更方便的函數來替換var_dump。 這就是Debugger :: dump()是什么。
~~~
$arr = [10, 20.2, TRUE, NULL, 'hello'];
dump($arr);
// 或者Tracy\Debugger::dump($arr);
~~~
很明顯這個是我們常用的測試變量。
生成輸出:

您還可以通過Debugger :: $ maxDepth更改嵌套深度,并通過Debugger :: $ maxLen更改顯示的字符串長度。 自然地,較低的值加速Tracy渲染。
~~~
Debugger::$maxDepth = 2; // default: 3
Debugger::$maxLen = 50; // default: 150
~~~
dump()函數可以顯示其他有用的信息。 Tracy \ Dumper :: LOCATION_SOURCE添加了工具提示和文件的路徑,函數被調用。 Tracy \ Dumper :: LOCATION_LINK添加了該文件的鏈接。 Tracy \ Dumper :: LOCATION_CLASS向包含文件路徑的每個轉儲對象添加一個工具提示,其中定義了對象的類。 所有這些常量可以在調用dump()之前在Debugger :: $ showLocation變量中設置。 您可以使用|一次設置多個值 運算符。
~~~
Debugger::$showLocation = Tracy\Dumper::LOCATION_SOURCE; // Shows path to where the dump() was called
Debugger::$showLocation = Tracy\Dumper::LOCATION_CLASS | Tracy\Dumper::LOCATION_LINK; // Shows both paths to the classes and link to where the dump() was called
Debugger::$showLocation = FALSE; // Hides additional location information
Debugger::$showLocation = TRUE; // Shows all additional location information
~~~
非常方便的替代Debugger :: dump()是Debugger :: barDump()。 這允許我們在Debugger Bar中轉儲變量。 這是有用的,因為轉儲不會弄亂輸出,我們還可以為轉儲添加標題。
~~~
Debugger::barDump([2, 4, 6, 8], 'even numbers up to ten');
Debugger::barDump([1, 3, 5, 7, 9], 'odd numbers up to ten');
~~~

定時
另一個有用的工具是調試器秒表,精度為微秒:
~~~
Debugger::timer();
// sweet dreams my cherrie
sleep(2);
$elapsed = Debugger::timer();
// $elapsed = 2
~~~
一次可以通過可選參數實現多個測量。
~~~
Debugger::timer('page-generating');
// some code
Debugger::timer('rss-generating');
// some code
$rssElapsed = Debugger::timer('rss-generating');
$pageElapsed = Debugger::timer('page-generating');
~~~
~~~
Debugger::timer(); // runs the timer
... // some time consuming operation
echo Debugger::timer(); // elapsed time in seconds
~~~
其實這章主要學會看Tracy還有日記,還有dump就可以了。其他的不用去設置,因為安裝包什么都幫我們設置好了。只是讓大家了解更細的的功能。不過也很少用的得到。
- Nette簡介
- 快速開始
- 入門
- 主頁
- 顯示文章詳細頁
- 文章評論
- 創建和編輯帖子
- 權限驗證
- 程序員指南
- MVC應用程序和控制器
- URL路由
- Tracy - PHP調試器
- 調試器擴展
- 增強PHP語言
- HTTP請求和響應
- 數據庫
- 數據庫:ActiveRow
- 數據庫和表
- Sessions
- 用戶授權和權限
- 配置
- 依賴注入
- 獲取依賴關系
- DI容器擴展
- 組件
- 字符串處理
- 數組處理
- HTML元素
- 使用URL
- 表單
- 驗證器
- 模板
- AJAX & Snippets
- 發送電子郵件
- 圖像操作
- 緩存
- 本土化
- Nette Tester - 單元測試
- 與Travis CI的持續集成
- 分頁
- 自動加載
- 文件搜索:Finder
- 原子操作