Phalcon 調試應用程序

調試應用程序(Debugging Applications)


Phalcon中提供了提供了幾種調試級別即通知,錯誤和異常。 異常類 Exception class 提供了發生錯誤時的一些常常使用的調試信息如文件,行,消息,錯誤代碼,跟蹤信息等。 Phalcon主要使用這個異常類來包裝這些功能,以方便開發人員或用戶使用。php

雖然Phalcon是使用C語言書寫的。但其依舊如其餘的PHP框架般提供了一些必須的調試工具。PHP自己提供的調試工具亦然可以正常使用。html

捕獲異常(Catching Exceptions)

縱觀Phalcon的文檔及其提供的樣例程序。 有一個最直接的捕獲異常的方法便是使用try/catch塊:mysql

<?

php try { //... some phalcon/php code } catch(\Exception $e) { } sql

try/catch塊內發生的異常會被捕獲而後放入 $e 變量。 開發人員可以使用 Phalcon\Exception (擴展自 Exception class)來肯定異常信息是來自Phalcon仍是PHP自己。 PHP產生的所有異常都是基於 Exception class 。 且至少含有例如如下元素:api

<?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 中取得異常信息同樣。 我也可以從 Phalcon\Exception 中取異常信息。app

<?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();
}

所以。 開發人員可以很easy找出在哪一個文件裏哪一行產生的異常信息,也可以看到異常信息涉及到的模塊:框架

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 獲取不少其它的信息。編輯器

調試組件(Debug component)

Phalcon提供的調試組件可以使開發人員更easy的定位代碼中的錯誤。工具

如下的視頻中展現了怎樣工做的(由於CSDN的編輯器不支持iframe故沒法播放):ui

要打開調試功能僅僅需要例如如下作:

<?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);

開發人員可以很easy的觀察到對象內部的狀態。

上面的代碼輸出例如如下:

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 是一個很好(奇妙)的調試工具,其和PHP內部調試工具一塊兒爲咱們提調試工具(可以和PHP內置的調試工具互補)。

 XDebug 也是一個PHP擴展, 因此兩者可以一塊兒使用。而且不需要額外的配置。

如下的視頻中展現了Phalcon中使用XDebug的狀況(由於CSDN的編輯器不支持iframe故沒法播放):


一旦安裝了xdebug, 開發人員便可以使用其API來取得不少其餘的異常信息和其餘信息:

咱們強烈推薦至少使用XDebug 2.2.3 以提供與Phalcon最佳的兼容性。如下的樣例中調用了 xdebug_print_function_stack 方法, 並返回了該方法產生的代碼跟蹤結果.

<?php

class SignupController extends \Phalcon\Mvc\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 ( XDebug 文檔)。

相關文章
相關標籤/搜索