ホームページ  >  記事  >  PHPフレームワーク  >  THINKPHP デバッグ モードと例外処理について話しましょう

THINKPHP デバッグ モードと例外処理について話しましょう

藏色散人
藏色散人転載
2022-01-18 17:00:244675ブラウズ

次のthinkphp フレームワークチュートリアル コラムでは、THINKPHP デバッグ モードと例外処理を有効にする方法を紹介します。

デバッグ モード

デバッグ モードをオンにするのは非常に簡単です。定数定義コードの行をエントリ ファイルに追加するだけです:

<?php
 // 开启调试模式
 define(&#39;APP_DEBUG&#39;, true);
 // 定义应用目录
 define(&#39;APP_PATH&#39;, &#39;./Application/&#39;);
 // 加载框架入口文件
 require &#39;./ThinkPHP/ThinkPHP.php&#39;;

When testing , DEBUG デバッグ モードをオンにします。開発モードでは、キャッシュ ファイルが自動的に生成され、テスト中にキャッシュされたファイルが自動的に呼び出され、エラーが発生します。

開発フェーズが完了し、運用環境にデプロイした後、必要なのは次のことだけです。デバッグ モードをオフにするか、デバッグ モード定義コードを削除して展開モードに切り替えます。

<?php
// 关闭调试模式
define(&#39;APP_DEBUG&#39;, false);
// 定义应用目录
define(&#39;APP_PATH&#39;, &#39;./Application/&#39;);
// 加载框架入口文件
require &#39;./ThinkPHP/ThinkPHP.php&#39;;

デバッグ モードの利点は次のとおりです:

  • ログをオンにすると、エラー情報とデバッグ情報が詳細に記録され、デバッグが容易になります。
  • オフにします。テンプレート キャッシュ、テンプレート 変更はすぐに有効になります;
  • SQL 分析を容易にするために SQL ログを記録します;
  • フィールド キャッシュをオフにします。データ テーブル フィールドの変更はキャッシュの影響を受けません;
  • ファイルの大文字と小文字を厳密にチェックします (Windows プラットフォームであっても)。これは、Linux の導入によって引き起こされる可能性のある隠れた問題を事前に発見するのに役立ちます;
  • ページのトレース機能によるデバッグとエラーの発見の向上;

デバッグ モードをオフにすると、エラー発生後に特定のエラー メッセージは表示されません。それでも特定のエラー メッセージを表示したい場合は、次のように設定できます:

&#39;SHOW_ERROR_MSG&#39;        =>  true,    // 显示错误信息

例外処理

デバッグ モードでシステムに重大なエラーが発生すると、例外は自動的にスローされます。または、ThinkPHP の組み込み E メソッドを使用して例外を手動でスローすることもできます。

E('新增失败');

例:

E('信息录入错误',25);

例外コード (デフォルトは 0) もサポートできます。 たとえば、TMPL_EXCEPTION_FILE 構成パラメータを設定して、システムのデフォルトの例外テンプレート ファイルを変更します。 :

'TMPL_EXCEPTION_FILE' => APP_PATH.'/Public/exception.tpl'

例外テンプレートで使用できる例外変数は次のとおりです:

$e['file']异常文件名
$e['line'] 异常发生的文件行数
$e['message'] 异常信息
$e['trace'] 异常的详细Trace信息

例外がスローされた後、通常、特定のエラー メッセージが表示されます。特定のエラー メッセージを参照し、エラーを閉じるように設定できます。情報を表示し、統合エラー メッセージを設定します。例:

'SHOW_ERROR_MSG' =>    false,
'ERROR_MESSAGE'  =>    '发生错误

すべての例外とエラーを指すように ERROR_PAGE パラメータを構成します。統合されたページに統合され、ユーザーに異常な情報が表示されるのを防ぎます。通常は展開モードで使用されます。 ERROR_PAGE パラメータは、完全な URL アドレスである必要があります。例:

'ERROR_PAGE' =>'/Public/error.html'

現在のドメイン名にない場合は、ドメイン名を指定することもできます:

'ERROR_PAGE' =>'http://www.myDomain.com/Public/error.html'

ERROR_PAGE が指すページでは、テンプレート変数の例外を使用できなくなります。

ロギング

デフォルトでは、ロギングはデバッグ モードでのみ記録されます。デプロイメント モードでロギングを有効にするには、構成で LOG_RECORD パラメータを有効にする必要があります。アプリケーション構成ファイルに記録する必要があるログ レベルを構成できます。例:

'LOG_RECORD' => true, // 开启日志记录
'LOG_LEVEL'  =>'EMERG,ALERT,CRIT,ERR', // 只记录EMERG ALERT CRIT ERR 错误

ログ レベル

ThinkPHP は、次のようなレベルに従ってシステム ログを分類します。

    ##EMERG
  • 重大なエラー、システムクラッシュおよび使用不能の原因 #ALERT
  • 注意すべきエラー、すぐに修正する必要があるエラー
  • CRIT
  • クリティカル値エラー、クリティカル値を超えるエラー
  • ERR
  • 一般エラー
  • WARN
  • 警告エラー、警告が必要なエラー
  • NOTICE
  • 通知、プログラムは実行できるがまだ完全ではないというエラー
  • #INFO 情報、プログラム出力情報
  • DEBUG デバッグ、デバッグ情報に使用されます
  • SQL SQL ステートメント、このレベルはデバッグ モードがオンになっている場合にのみ有効です
  • 記録方法
  • ログ記録方法はデフォルトでファイル モードですが、ドライバーを介してより多くの記録方法をサポートするように拡張できます。

記録方法は、LOG_TYPE パラメータによって構成されます。例:

'LOG_TYPE'              =>  'File', // 日志记录类型 默认为文件方式

ファイル モード記録。対応するドライバー ファイルは、システムの

Library/Think/Log にあります。 /Driver/File.class .php

手動記録

通常、システムのログは自動で行われるため、手動記録は必要ありません。ただし、場合によっては、ログ情報を手動で記録する必要もあります。Log クラスには 3 つのメソッドがあります。ログ記録用。

#メソッド

説明ログ情報をメモリに記録する
##Log::r​​ecord()
Log::save() メモリに保存されているログ情報を書き込みます(指定された記録方法を使用)
Log::write() ログ メッセージをリアルタイムで書き込む

由于系统在请求结束后会自动调用Log::save方法,所以通常,你只需要调用Log::record记录日志信息即可。

默认记录的日志级别是ERR,也可以指定日志级别:

Think\Log::record('测试日志信息,这是警告级别','WARN');

record方法只会记录当前配置允许记录的日志级别的信息,如果应用配置为:

'LOG_LEVEL'  =>'EMERG,ALERT,CRIT,ERR', // 只记录EMERG ALERT CRIT ERR 错误

那么上面的record方法记录的日志信息会被直接过滤,或者你可以强制记录:

Think\Log::record('测试日志信息,这是警告级别','WARN',true);

采用record方法记录的日志信息不是实时保存的,如果需要实时记录的话,可以采用write方法,例如:

Think\Log::write('测试日志信息,这是警告级别,并且实时写入','WARN');

write方法写入日志的时候 不受配置的允许日志级别影响,可以实时写入任意级别的日志信息。

页面trace

在部署模式下面,显示的调试信息没有调试模式完整,通常我们建议页面Trace配合调试模式一起使用。

要开启页面Trace功能,需要在项目配置文件中设置:

// 显示页面Trace信息
'SHOW_PAGE_TRACE' =>true,

该参数默认为关闭,开启后并且你的页面有模板输出的话,页面右下角会显示ThinkPHP的LOGO:

我们看到的LOGO后面的数字就是当前页面的执行时间(单位是秒) 点击该图标后,会展开详细的页面Trace信息,如图:

页面Trace框架有6个选项卡,分别是基本、文件、流程、错误、SQL和调试,点击不同的选项卡会切换到不同的Trace信息窗口。

选项卡 描述
基本 当前页面的基本摘要信息,例如执行时间、内存开销、文件加载数、查询次数等等。
文件 详细列出当前页面执行过程中加载的文件及其大小。
流程 会列出当前页面执行到的行为和相关流程(待完善)。
错误 当前页面执行过程中的一些错误信息,包括警告错误。
SQL 当前页面执行到的SQL语句信息。
调试 开发人员在程序中进行的调试输出。

页面Trace的选项卡是可以定制和扩展的,默认的配置为:

'TRACE_PAGE_TABS'=>array(
    'base'=>'基本',
     'file'=>'文件',
     'think'=>'流程',
     'error'=>'错误',
     'sql'=>'SQL',
     'debug'=>'调试'
)

把刚才的用户信息调试输出到用户选项卡,trace方法的用法如下:

trace($user,'用户信息','user');

保存这些trace信息,我们可以配置PAGE_TRACE_SAVE参数

'PAGE_TRACE_SAVE'=>true

如果不希望保存所有的选项卡的信息,可以设置需要保存的选项卡,例如:

'PAGE_TRACE_SAVE' => array('base','file','sql');

Trace方法

页面Trace只能用于有页面输出的情况,但是trace方法可以用在任何情况,而且trace方法可以用于AJAX等操作。

Trace方法的格式:

trace('变量','标签','级别','是否记录日志')

例如:

$info = '测试信息';
trace($info,'提示');

如果希望把变量调试输出到页面Trace的某个选项卡里面,可以使用:

trace($info,'提示','user');

如果是输出到ERR选项卡,并且开启 'TRACE_EXCEPTION'=>true的话,

trace($info,'错误','ERR');

会抛出异常。 有三种情况下,trace方法会记录日志:

  • AJAX请求

  • SHOW_PAGE_TRACE为false,也就是页面Trace关闭的情况下

  • trace方法的第四个参数为true

断点调试

凭借强大的页面Trace信息功能支持,ThinkPHP可以支持断点调试功能。 我们只需要在不同的位置对某个变量进行trace输出即可,例如:

 $blog = D("Blog");
 $vo = $blog->create();
 trace($vo,'create vo');
 $vo = $blog->find();
 trace($vo,'find vo');

变量调试

输出某个变量是开发过程中经常会用到的调试方法

用法:

dump($var, $echo=true, $label=null, $strict=true)

相关参数的使用如下:

参数 描述
var(必须) 要输出的变量,支持所有变量类型
echo(可选) 是否直接输出,默认为true,如果为false则返回但不输出
label(可选) 变量输出的label标识,默认为空
strict(可选) 输出变量类型,默认为true,如果为false则采用print_r输出

如果echo参数为false 则返回要输出的字符串

使用示例:

 $Blog = D("Blog");
 $blog = $Blog->find(3);
 dump($blog);

性能调试

G方法可以很方便的获取某个区间的运行时间和内存占用情况。 例如:

G('begin');
// ...其他代码段
G('end');
// ...也许这里还有其他代码
// 进行统计区间
echo G('begin','end').'s';

G('begin','end') 表示统计begin位置到end位置的执行时间(单位是秒),begin必须是一个已经标记过的位置,如果这个时候end位置还没被标记过,则会自动把当前位置标记为end标签,输出的结果类似于:0.0056s

默认的统计精度是小数点后4位,如果觉得这个统计精度不够,还可以设置例如:

G('begin','end',6).'s';

可能的输出会变成:0.005587s

如果你的环境支持内存占用统计的话,还可以使用G方法进行区间内存开销统计(单位为kb),例如:

echo G('begin','end','m').'kb';

第三个参数使用m表示进行内存开销统计,输出的结果可能是:625kb

错误调试

如果需要我们可以使用E方法输出错误信息并中断执行,例如:

//输出错误信息,并中止执行
E($msg);

模型调试

调试执行的SQL语句

在模型操作中 ,为了更好的查明错误,经常需要查看下最近使用的SQL语句,我们可以用getLastsql方法来输出上次执行的sql语句。例如:

$User = M("User"); // 实例化User对象
$User->find(1);
echo $User->getLastSql();
// 3.2版本中可以使用简化的方法
echo $User->_sql();

每个模型都使用独立的最后SQL记录,互不干扰,但是可以用空模型的getLastSql方法获取全局的最后SQL记录

调试数据库错误信息

在模型操作中,还可以获取数据库的错误信息,例如:

$User = M("User"); // 实例化User对象
$result = $User->find(1);
if(false === $result){
    echo $User->getDbError();
}

CURD操作如果返回值为false,表示数据库操作发生错误,这个时候就需要使用模型的getDbError方法来查看数据库返回的具体错误信息。

以上がTHINKPHP デバッグ モードと例外処理について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。