| 調試應用程式(Debugging Applications)¶ Phalcon中提供了提供了幾種調試層級即通知,錯誤和異常。 異常類 Exception class 提供了錯誤發生時的一些常用的調試資訊如檔案,行,訊息,錯誤碼,跟蹤資訊等。 Phalcon主要使用這個異常類來封裝這些功能,以方便開發人員或使用者使用。 儘管Phalcon是使用C語言書寫的,但其依然如其它的PHP架構般提供了一些必須的調試工具,PHP本身提供的調試工具亦然可以正常使用。 捕獲異常(Catching Exceptions)¶縱觀Phalcon的文檔及其提供的例子程式, 有一個最直接的捕獲異常的方法即是使用try/catch塊: <?phptry { // ... Some Phalcon/PHP code} catch (\Exception $e) {}try/catch塊內發生的異常會被捕獲然後放入 $e 變數。 開發人員可以使用 Phalcon\Exception (擴充自 Exception class )來確定異常資訊是來自Phalcon還是PHP本身。 PHP產生的所有異常都是基於 Exception class , 且至少含有如下元素: <?phpclass 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 中取異常資訊。 <?phptry { // ... 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=‘[email protected]‘)#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提供的調試組件可以使開發人員更容易的定位代碼中的錯誤。 下面的視頻中展示了如何工作的: 要開啟調試功能只需要如下做: <?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 是一個非常好(神奇)的調試工具,其和PHP內部調試工具一起為我們提調試工具(可以和PHP內建的調試工具互補)。 XDebug 也是一個PHP擴充, 所以二者可以一起使用,而且不需要額外的配置。 下面的視頻中展示了Phalcon中使用XDebug的情況: 一旦安裝了xdebug, 開發人員便可以使用其API來取得更多的異常資訊和其它資訊:
我們強烈推薦至少使用XDebug 2.2.3 以提供與Phalcon最佳的相容性。
下面的例子中調用了 xdebug_print_function_stack 方法, 並返回了該方法產生的代碼跟蹤結果: <?phpuse 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 19Call 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 文檔)。 |