PHPのデバッグとトラブルシューティングを行うにはどうすればよいですか?

PHPz
リリース: 2020-09-05 11:23:18
転載
2003 人が閲覧しました

PHPのデバッグとトラブルシューティングを行うにはどうすればよいですか?

私は長い間 PHP 開発を行ってきましたが、ここでは一般的に使用されるデバッグ方法をまとめます。

1 コードのデバッグ

1.1 印刷出力

エコーの使用、var_dump、print_r などのメソッドは、デバッグが必要な場合に出力を出力します。特定の変数の値を出力することで、プログラムが正しく実行されたかどうかを判断できます。

1.2 <code><span style="font-size: 16px;">debug_backtrace</span>debug_backtrace 関数を使用してコール スタック情報を出力します:

debug_print_backtrace();exit;
ログイン後にコピー


#0 cli_Rakuten->getOrders(1)
#1 call_user_func_array(Array ([0] => cli_Rakuten Object (),[1] => getOrders), Array ([ 0] => 1)) [/data/project/***/include/of/of.php:79]

#2 of::cliDispatch(cli_Rakuten, getOrders, 1, Array ( [0 ] => 1)) [/data/project/***/cli.php:17]

で呼び出されます1.3 xdebug を使用してコードをデバッグします

PHP xdebug デバッグ ツールのインストールと使用

Xdebug は、実行中の追跡、デバッグ、分析に使用できるオープン ソースの PHP プログラム デバッガー (つまり、デバッグ ツール) です。 PHPプログラムの状況。

phpstorm xdebug を設定した後、ブレークポイントを使用してコードを簡単にデバッグできます。

xdebug は、コール スタック情報の生成に加えて、パフォーマンス分析レポートも生成できます。では、Windows で WinCacheGrind を使用してパフォーマンス分析レポートを表示できます。

1.4 xhprof を使用してコードをデバッグおよび分析する

XHProf は、PHP のパフォーマンスをテストするために Facebook によって開発された拡張機能です。

xdebugローカルの開発環境であれば性能解析 xdebug で十分ですが、オンライン環境の場合

はコストがかかり、構成の自由度も低いため、使用することをお勧めしますxhprof はオンライン環境で PHP パフォーマンスの追跡と分析を実行します。

xhprof のインストールは非常に簡単で、インストール ドキュメントを直接検索できます。

コードに xhprof 分析レポートを生成するコードを追加します:
xhprof_enable(
        XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,
        [
            &#39;ignored_functions&#39;    => [
                &#39;call_user_func&#39;,
                &#39;call_user_func_array&#39;
            ]
        ]);

//这里是业务代码
//...


$xhprofData = xhprof_disable();
require &#39;/data/soft/xhprof/xhprof_lib/utils/xhprof_lib.php&#39;;
require &#39;/data/soft/xhprof/xhprof_lib/utils/xhprof_runs.php&#39;;
$xhprofRuns = new XHProfRuns_Default();
$runId = $xhprofRuns->save_run($xhprofData, &#39;xhprof_test&#39;);
echo &#39;http://192.168.52.129:8888/xhprof_html/index.php?run=&#39; . $runId . &#39;&source=xhprof_test&#39;.PHP_EOL;
ログイン後にコピー

レポートの表示:

グラフィック レポート:

2 ログ分析

ログ、通常はシステムの操作またはソフトウェアまたはアプリケーションの記録。ログ分析を通じて、ユーザーはシステム、ソフトウェア、アプリケーションの動作状況を簡単に理解できます。アプリケーション ログが十分に充実している場合は、過去のユーザーの動作動作、タイプの設定、地理的分布などの詳細な情報も分析できます。アプリケーションのログも複数のレベルに分割されているため、アプリケーションの健全性状態を簡単に分析し、タイムリーに問題を発見し、問題を迅速に特定して解決し、損失を修復することができます。

2.1 PHP ログ

2.1.1 PHP エラー ログ

PHP エラー ログは次のとおりです。設定ファイル php.ini の Set にあります:

log_errors = On

error_log = /var/log/php-fpm/php_errors.log

また、php-fpm 設定ファイル php-fpm.conf で設定することもできます:

php-fpm プロセス ログ。php-fpm プロセスに関連するログ情報を記録します

error_log = /var/log /php-fpm/error.log

エラー ログは php-fpm.conf でも設定でき、php.ini の関連設定が上書きされます

php_admin_value[error_log] = /var/log/php-fpm/www-error.log

php_admin_flag[log_errors] = on

2.1.2 php スローログ

slowlog = /var/log/php-fpm/www-slow.log

#request_slowlog_timeoutを超えた実行時間が記録されますスローログ

request_slowlog_timeout = 1s

スロー ログ ファイルには、実行時間の長い関数情報が記録されます:

[19-Sep-2018 11 :00:55] [プール www ] pid 80603

script_filename = /data/project/test//slow.php

[0x00007f4e0a7ed568] sleep() /data/project/test/slow .php:5

2.2 ビジネスログ

php の組み込み error_log 関数と syslog 関数は強力で優れたパフォーマンスを持っていますが、様々な欠陥(error_logにエラーレベルがない、固定フォーマットがない、syslogがモジュールに分割されていない、システムログと混在する)により、柔軟性が大幅に低下し、アプリケーションのニーズに応えることができません。 <🎜>

当然我们可以自己封装实现一个符合PHP PSR-3 日志接口规范 所要求的模块、级别、清晰、易用等特点的日志库,但通常不建议这样做,因为已经有一些非常好的第三方日志库了,我们可直接用。

这里挑选3款应用比较广的日志库进行比较:

log4php

文档:http://logging.apache.org/log4php/quickstart.html

log4php是apche组织维护项目,是log4xx系列日志组件之一,log4j在JAVA中可算是大名鼎鼎的日志开发包。log4php也作为一个单独的子项目存在,可以很方便的加载使用。

优点:

最为著名、设计精良、格式完美、文档完善、功能强大、扩展方便

缺点:

只支持TRACE、DEBUG、INFO、WARN、ERROR、FATAL共6个日志级别,不完全符合psr-3日志规范
停止维护了,目前最新版本还是更新于2012-12-13日v2.3.0
性能较差

Monolog

github地址:https://github.com/Seldaek/monolog

使用方法:https://www.jianshu.com/p/59ce6d70f801

Monolog是一款强大的日志处理类库,应用非常广泛,目前有包括Symfony 、Laravel、 CakePHP、YII等诸多知名php框架都内置了Monolog。Monolog可以发送你的日志到文件、到sockets、到邮箱、到数据库或(和)者其他网路存储服务(云)。这里用了,因为Monolog的确可以做到同时保存到一个或多个存储介质。

优点:

功能强大、应用广泛、安装方便、设计优秀,使用灵活、扩展方便、更新活跃

缺点:性能较差

SeasLog

github地址:https://github.com/Neeke/SeasLog

使用方法:https://blog.csdn.net/u011120720/article/details/51474488

SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便、规范、高效地写日志,以及快速地读取和查询日志。

优点:高性能、功能完善

缺点:

安装配置较麻烦,如编译PHP扩展

扩展不方便

比较

从功能上比较:

Monolog > SeasLog > log4php

从性能上比较:

SeasLog > Monolog > log4php

3 进程跟踪

3.1 使用lsof查看进程打开的文件句柄

Linux平台提供了lsof工具可以查看某个进程打开的文件句柄,可以用于跟踪进程所有打开的socket、file、资源。

lsof -p 2901

3.2 使用strace跟踪进程中的系统调用

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

跟踪可执行程序:

strace -T -tt -s 512 php /data/project/***/cli.php test
ログイン後にコピー

跟踪服务程序

strace -T -tt -s 512 -p 1123
ログイン後にコピー

默认返回的结果每一行代表一条系统调用,规则为“系统调用的函数名及其参数=函数返回值”。

3.3 gdb调试php进程

一般的php问题通过以上的这些方法排查出来了。但还有死循环、进程异常退出等问题可通过gdb分析core dump文件来排查原因。

//修改core file size
ulimit -c unlimited
//修改core dump文件生成位置
echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern
//用gdb调试core dump文件
gdb php -c core.31656
ログイン後にコピー

4 网络抓包

4.1 使用tcpdump抓包

在调试网络通信程序是tcpdump是必备工具。tcpdump很强大,可以看到网络通信的每个细节。如TCP,可以看到3次握手,PUSH/ACK数据推送,close4次挥手,全部细节。包括每一次网络收包的字节数,时间等。

tcpdump -i any tcp port 80  

  • 18:01:37.968224 時刻は微妙に正確です
  • 192.168.52.1.64504 > T1.http は通信の流れを表し、64504 がクライアントです。 、T1 .http はサーバー側ポート 80 です。
  • [S] は、これが SYN リクエストであることを意味します。
  • [.] は、これが SYN リクエストであることを意味します。 ACK 確認パケット、(クライアント)SYN->(サーバー)SYN->(クライアント)ACK は 3 ウェイ ハンドシェイク プロセスです
  • [P] は、これがデータ プッシュであることを意味します、サーバーからのプッシュである可能性があります。 エンドからクライアントへ、またはクライアントからサーバーへプッシュ
  • [F] は、これが FIN パケットであることを意味します。これは、接続を閉じる操作であり、次の可能性があります。クライアント/サーバーによって開始
  • [R] は、これが F パッケージと同じ機能を持つ RST パッケージであることを意味しますが、RST は、接続が閉じられたときに、処理されていない静止データ。接続を強制的に切断すると理解できます
  • win 2053 はスライディング ウィンドウのサイズを指します
  • length 7300 は、 data packet

4.2 ngrep を使用してパケットをキャプチャする

tcpdump はネットワーク通信の詳細をキャプチャできますが、単純な情報だけを確認したい場合は、送信されたデータなどの情報については、ngrep コマンド

ngrep -pqt -W byline port 80 -d ens33

を使用できます。 PHP 中国語 Web サイト にアクセスしてください! !

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート