# 調試應用程序(Debugging Applications)

Phalcon中提供了提供了幾種調試級別即通知,錯誤和異常。 異常類[Exception class](http://www.php.net/manual/en/language.exceptions.php)提供了錯誤發生時的一些常用的調試信息如文件,行,消息,錯誤代碼,跟蹤信息等。 Phalcon主要使用這個異常類來包裝這些功能,以方便開發者或用戶使用。
盡管Phalcon是使用C語言書寫的,但其依然如其它的PHP框架般提供了一些必須的調試工具,PHP本身提供的調試工具亦然可以正常使用。
## 捕獲異常(Catching Exceptions)
縱觀Phalcon的文檔及其提供的例子程序, 有一個最直接的捕獲異常的方法即是使用try/catch塊:
~~~
<?php
try {
// ... Some Phalcon/PHP code
} catch (\Exception $e) {
}
~~~
try/catch塊內發生的異常會被捕獲然后放入`$e`變量。 開發者可以使用[Phalcon\\Exception](http://docs.iphalcon.cn/api/Phalcon_Exception.html)(擴展自[Exception class](http://www.php.net/manual/en/language.exceptions.php))來確定異常信息是來自Phalcon還是PHP本身。 PHP產生的所有異常都是基于[Exception class](http://www.php.net/manual/en/language.exceptions.php), 且至少含有如下元素:
~~~
<?php
class Exception
{
/* Properties */
protected string $message;
protected int $code;
protected string $file;
protected int $line;
/* Methods */
public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]])
final public string getMessage ( void )
final public Exception getPrevious ( void )
final public mixed getCode ( void )
final public string getFile ( void )
final public int getLine ( void )
final public array getTrace ( void )
final public string getTraceAsString ( void )
public string __toString ( void )
final private void __clone ( void )
}
~~~
如從[Exception class](http://www.php.net/manual/en/language.exceptions.php)中取得異常信息一樣, 我也可以從[Phalcon\\Exception](http://docs.iphalcon.cn/api/Phalcon_Exception.html)中取異常信息。
~~~
<?php
try {
// ... App code ...
} catch (\Exception $e) {
echo get_class($e), ": ", $e->getMessage(), "\n";
echo " File=", $e->getFile(), "\n";
echo " Line=", $e->getLine(), "\n";
echo $e->getTraceAsString();
}
~~~
因此, 開發者可以非常容易找出在哪個文件中哪一行產生的異常信息,也可以看到異常信息涉及到的模塊:
~~~
PDOException: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost'
(using password: NO)
File=/Applications/MAMP/htdocs/invo/public/index.php
Line=74
#0 [internal function]: PDO->__construct('mysql:host=loca...', 'root', '', Array)
#1 [internal function]: Phalcon\Db\Adapter\Pdo->connect(Array)
#2 /Applications/MAMP/htdocs/invo/public/index.php(74):
Phalcon\Db\Adapter\Pdo->__construct(Array)
#3 [internal function]: {closure}()
#4 [internal function]: call_user_func_array(Object(Closure), Array)
#5 [internal function]: Phalcon\Di->_factory(Object(Closure), Array)
#6 [internal function]: Phalcon\Di->get('db', Array)
#7 [internal function]: Phalcon\Di->getShared('db')
#8 [internal function]: Phalcon\Mvc\Model->getConnection()
#9 [internal function]: Phalcon\Mvc\Model::_getOrCreateResultset('Users', Array, true)
#10 /Applications/MAMP/htdocs/invo/app/controllers/SessionController.php(83):
Phalcon\Mvc\Model::findFirst('email='demo@pha...')
#11 [internal function]: SessionController->startAction()
#12 [internal function]: call_user_func_array(Array, Array)
#13 [internal function]: Phalcon\Mvc\Dispatcher->dispatch()
#14 /Applications/MAMP/htdocs/invo/public/index.php(114): Phalcon\Mvc\Application->handle()
#15 {main}
~~~
從上面我們可以看到異常信息中有Phalcon的類及方法,甚至調用時的參數也顯示了出來。 如果需要可以使用[Exception::getTrace](http://www.php.net/manual/en/exception.gettrace.php)獲取更多的信息。
## 調試組件(Debug component)
Phalcon提供的調試組件可以使開發者更容易的定位代碼中的錯誤。
下面的視頻中展示了如何工作的:
要打開調試功能只需要如下做:
~~~
<?php
$debug = new \Phalcon\Debug();
$debug->listen();
~~~
注意一定要去掉Try/Catch塊才可以, 否則異常信息不會正確的輸出(事實上很多時候Phalco顯示異常信息是非常耗時的)。
## 反射與內省(Reflection and Introspection)
Phalcon的類的實例通常比一般的類實例更復雜。 這里我們可以使用 ‘Reflection API’\_ (反射機制) 或 直接打印其內部狀態來觀其究竟:
~~~
<?php
$router = new Phalcon\Mvc\Router();
print_r($router);
~~~
開發者可以非常容易的觀察到對象內部的狀態。 上面的代碼輸出如下:
~~~
Phalcon\Mvc\Router Object
(
[_dependencyInjector:protected] =>
[_module:protected] =>
[_controller:protected] =>
[_action:protected] =>
[_params:protected] => Array
(
)
[_routes:protected] => Array
(
[0] => Phalcon\Mvc\Router\Route Object
(
[_pattern:protected] => #^/([a-zA-Z0-9\_]+)[/]{0,1}$#
[_compiledPattern:protected] => #^/([a-zA-Z0-9\_]+)[/]{0,1}$#
[_paths:protected] => Array
(
[controller] => 1
)
[_methods:protected] =>
[_id:protected] => 0
[_name:protected] =>
)
[1] => Phalcon\Mvc\Router\Route Object
(
[_pattern:protected] => #^/([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)(/.*)*$#
[_compiledPattern:protected] => #^/([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)(/.*)*$#
[_paths:protected] => Array
(
[controller] => 1
[action] => 2
[params] => 3
)
[_methods:protected] =>
[_id:protected] => 1
[_name:protected] =>
)
)
[_matchedRoute:protected] =>
[_matches:protected] =>
[_wasMatched:protected] =>
[_defaultModule:protected] =>
[_defaultController:protected] =>
[_defaultAction:protected] =>
[_defaultParams:protected] => Array
(
)
)
~~~
## 使用 XDebug(Using XDebug)
[XDebug](http://xdebug.org/)是一個非常好(神奇)的調試工具,其和PHP內部調試工具一起為我們提調試工具(可以和PHP內置的調試工具互補)。[XDebug](http://xdebug.org/)也是一個PHP擴展, 所以二者可以一起使用,而且不需要額外的配置。
下面的視頻中展示了Phalcon中使用XDebug的情況:
一旦安裝了xdebug, 開發者便可以使用其API來取得更多的異常信息和其它信息:
> 我們強烈推薦至少使用XDebug 2.2.3 以提供與Phalcon最佳的兼容性。
下面的例子中調用了[xdebug\_print\_function\_stack](http://xdebug.org/docs/stack_trace)方法, 并返回了該方法產生的代碼跟蹤結果:
~~~
<?php
use Phalcon\Mvc\Controller;
class SignupController extends Controller
{
public function indexAction()
{
}
public function registerAction()
{
// Request variables from HTML form
$name = $this->request->getPost("name", "string");
$email = $this->request->getPost("email", "email");
// Stop execution and show a backtrace
return xdebug_print_function_stack("stop here!");
$user = new Users();
$user->name = $name;
$user->email = $email;
// Store and check for errors
$user->save();
}
}
~~~
這個例子中, XDebug顯示出了局部變量和代碼的跟蹤信息:
~~~
Xdebug: stop here! in /Applications/MAMP/htdocs/tutorial/app/controllers/SignupController.php
on line 19
Call Stack:
0.0383 654600 1. {main}() /Applications/MAMP/htdocs/tutorial/public/index.php:0
0.0392 663864 2. Phalcon\Mvc\Application->handle()
/Applications/MAMP/htdocs/tutorial/public/index.php:37
0.0418 738848 3. SignupController->registerAction()
/Applications/MAMP/htdocs/tutorial/public/index.php:0
0.0419 740144 4. xdebug_print_function_stack()
/Applications/MAMP/htdocs/tutorial/app/controllers/SignupController.php:19
~~~
使用xdebug我們可以使用若干種方法來取得關phalcon應用的調試信息。更多信可以參看這里的[XDebug documentation](http://xdebug.org/docs)( XDebug 文檔)。
- 簡介
- 安裝
- 安裝(installlation)
- XAMPP下的安裝
- WAMP下安裝
- Nginx安裝說明
- Apache安裝說明
- Cherokee 安裝說明
- 使用 PHP 內置 web 服務器
- Phalcon 開發工具
- Linux 系統下使用 Phalcon 開發工具
- Mac OS X 系統下使用 Phalcon 開發工具
- Windows 系統下使用 Phalcon 開發工具
- 教程
- 教程 1:讓我們通過例子來學習
- 教程 2:INVO簡介
- 教程 3: 保護INVO
- 教程4: 使用CRUD
- 教程5: 定制INVO
- 教程 6: V?kuró
- 教程 7:創建簡單的 REST API
- 組件
- 依賴注入與服務定位器
- MVC架構
- 使用控制器
- 使用模型
- 模型關系
- 事件與事件管理器
- Behaviors
- 模型元數據
- 事務管理
- 驗證數據完整性
- Workingwith Models
- Phalcon查詢語言
- 緩存對象關系映射
- 對象文檔映射 ODM
- 使用視圖
- 視圖助手
- 資源文件管理
- Volt 模版引擎
- MVC 應用
- 路由
- 調度控制器
- Micro Applications
- 使用命名空間
- 事件管理器
- Request Environmen
- 返回響應
- Cookie 管理
- 生成 URL 和 路徑
- 閃存消息
- 使用 Session 存儲數據
- 過濾與清理
- 上下文編碼
- 驗證Validation
- 表單_Forms
- 讀取配置
- 分頁 Pagination
- 使用緩存提高性能
- 安全
- 加密與解密 Encryption/Decryption
- 訪問控制列表
- 多語言支持
- 類加載器 Class Autoloader
- 日志記錄_Logging
- 注釋解析器 Annotations Parser
- 命令行應用 Command Line Applications
- Images
- 隊列 Queueing
- 數據庫抽象層
- 國際化
- 數據庫遷移
- 調試應用程序
- 單元測試
- 進階技巧與延伸閱讀
- 提高性能:下一步該做什么?
- Dependency Injection Explained
- Understanding How Phalcon Applications Work
- Api
- Abstract class Phalcon\Acl