PHPをデバッグする方法を教えてください



apacheで動いている状態で、エラーは出ていないが動作がおかしい時(WEBアプリ以外ならデバッガーでステップ実行したり、変数をwatchするような時)のデバッグ方法を教えてください。


※多分ログ出力でやるのではないかと思いますが、その場合のログ出力の記法と出力先が知りたいです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/08/19 11:00:13
  • 終了:2007/08/26 11:05:03

回答(4件)

id:xxxatsxxx No.1

xxxatsxxx回答回数45ベストアンサー獲得回数22007/08/19 11:47:49

ポイント23pt

Loggerを実装するのが普通かと。

それか、ライブラリを利用しましょう。

Log4PHP@ Apache

とか

log4pなど。

あとは、デバグモジュールならブレークポイントが使えます。

http://dd.cron.ru/dbg/

eclipseと連携できたりします。

id:garyo

xxxatsxxxさん、こんにちは。

>Loggerを実装するのが普通かと。

ありがとうございます。

「PHP Logger」で検索すると以下のサイトがありました。

http://labs.unoh.net/2007/05/php-logging-to-text-files.html

error_log関数が使いやすそうです。

2007/08/19 12:36:17
id:takabow No.2

noname回答回数51ベストアンサー獲得回数142007/08/19 12:11:12

ポイント23pt

私はEclipseプロジェクトの1つである、PHP Development Tools framework for the Eclipse(PDT)を使っています。

http://www.eclipse.org/pdt/

 

こいつはPHPの統合開発環境であり、PHPを動作させるサーバと連携して、リモートデバッグを行うことができます。

その他の機能も申し分なく、過去にEclipseを使ったことある人なら、難なく移行できると思います。

http://blog.cles.jp/item/2005

http://yosaku2005.spaces.live.com/blog/cns!EC4147A83A01AE21!347.entry

http://hp.vector.co.jp/authors/VA000137/phpide/qanda.html

 

と、開発環境が変わるので最初は大変かと思いますが...

これを使わないで簡単にデバッグするときは、下のコメントでもいわれているように、いわゆるprintfデバッグっぽいことをしてます。

WEBページの各所に変数をprintなりvar_dumpなりで吐き出させて変数の流れを追ってます。

id:garyo

ありがとうございます。

PHP用のリモートデバッガがあるんですね。

Eclipseは試しにさわったことがあるくらいであまり使ったことはありません。

デバッガがあれば便利ですが、そこまで凝ったことをやるわけではなく

>WEBページの各所に変数をprintなりvar_dumpなりで吐き出させて変数の流れを追ってます。

このくらいが出来れば十分です。

2007/08/19 13:00:42
id:tezcello No.3

tezcello回答回数460ベストアンサー獲得回数692007/08/19 12:32:10

ポイント22pt

phpのデバッグ環境は幾つかある様です。

  • 少し記事が古いですが、

http://itpro.nikkeibp.co.jp/members/ITPro/oss/20041007/150995/?P...

  • eclipse 用プラグイン

http://journal.mycom.co.jp/column/ide/006/index.html

  • VisualStudio 用のプラグイン

http://www.asial.co.jp/vsphp/


エラーログを出力する方法や、エラーを発生させたりなどの諸々も

出来る様です。

http://www.php.net/manual/ja/ref.errorfunc.php#ini.error-log

display_errors, display_startup_errors を有効にして、ブラウザ上でエラーメッセージを得るのはいつもやっています。(社内システムは本番でも有効のままにしているものもあります。)


個人的にはデバッガを使わなければならない程のシステムは扱っていないので、専ら var_dump() です。

画面表示が乱れる事もお構いなしに単純に表示されています。

出力サイズが膨大になる場合などはファイルに出力する場合もありますが。

(因に、var_dump() は無条件で画面に出力してくれます。後でまとめて書き出す場合や、ファイルに書き出す場合は var_export() を使います。)

id:garyo

ありがとうございます。

var_dump() を使ってみました。

(index.phpで最初に変数が出るところに入れてみました)

$_POST = strings_stripSlashes($_POST);
$login = isset($_POST['login']) ? $_POST['login'] : null;
$pwd = isset($_POST['password']) ? $_POST['password'] : null;

error_log(print_r($_POST), 3, 'c:\temp\error.log');
var_dump($_POST);

値を表示したページを開いて止まるみたいですね。

例 NULL とだけ表示したページがでる。


BreakPoint風にどこかで止めてデバッグするときはvar_dump()

動かしながらLOGで確認するときはerr_log()で出来そうですね。

2007/08/19 13:55:42
id:Yota No.4

Yota回答回数453ベストアンサー獲得回数282007/08/20 10:13:13

ポイント22pt

インタープリタが出すメッセージを読めば、ほとんどのことがわかると思います。設定としてはこんな感じで。

PHP: エラー処理およびログ記録関数 - Manual

error_reporting = E_ALL & ~E_NOTICE

display_errors = On

display_startup_errors = On

本番のときは、

display_errors = Off

log_errors = On

error_log = /hoge/php_error.log

ただし、parse error(構文がおかしい)などは、表示される行番号(line)を見てもどこがエラーかわからない場合があります。例えば、単純に{を閉じ忘れた場合です。専用のエディタや開発環境を利用すれば、そのへんが書いている途中でわかります。

id:garyo

情報ありがとうございます。

2007/08/20 16:57:59
  • id:tezcello
    僕は、var_dump() で変数の値や、関数の戻り値を表示しながらやっていますが、それではダメ?
  • id:garyo
    tezcelloさん、こんにちは。
    私は組み込み系プログラマやっています。
    仕事でPHPを使うことは無いのですが、色々便利なWEBアプリがあるのでWEBアプリは良く使っています。
    先日あるWEBアプリを日本語化しようとした時、エラーにはならないけど、動作が期待したものにならないことがあってPHPのスクリプトはどうやってデバッグするのだろうかと思いました。


    例えば「var_dump()」関数を使うとして、その出力結果をどこに出すのか(画面に出すのか、ログファイルを作って出力するのか、標準で何かログ操作用の関数群があるのか)というのが知りたいです。


    PHP言語は知らないけど、他言語での開発経験のあるユーザーがPHPで書かれたWEBアプリを改良したいときのデバッグ方法が知りたいです。

  • id:xxxatsxxx
    error_logでもいいと思いますが、実環境では少々面倒になると思います。
    error_logだとLEVEL(INFO/DEBUGなど)による制御ができないと思いますので…。
    仕事で使うことはないとの事で、お手軽にやりたいのであれば全然問題ないですが、リリース等する予定があればLEVEL切り替えが必須です。
  • id:garyo
    PHPでRubyのLoggerのようなレベル制御のできるLoggerはありますか?
    http://jp.rubyist.net/magazine/?0008-BundledLibraries
  • id:tezcello
    var_dump() そのものには実行を止める働きは無いので、表示が止まってしまうのは何か別の要因があるのではと思います。
    値が NULL であるのは、strings_stripSlashes() (自作の関数でしょうか?)がそう返しているからで、そこを調べる必要があるでしょうね。

    ロギングについては、こんなページがありました。
    http://www.myspacehooker.com/proxy/index.php?q=aHR0cDovL2xhYnMudW5vaC5uZXQvMjAwNy8wNS9waHAtbG9nZ2luZy10by10ZXh0LWZpbGVzLmh0bWw%3D
  • id:garyo
    >var_dump() そのものには実行を止める働きは無いので、表示が止まってしまうのは何か別の要因があるのではと思います。
    そうなんですか。

    >値が NULL であるのは、strings_stripSlashes() (自作の関数でしょうか?)がそう返しているからで、そこを調べる必要があるでしょうね。
    別に$_POSTの値を調べる必要があったわけではなくて、単純にindex.php内で最初に使われていた変数だったので、表示させてみました。
  • id:tezcello
    > そうなんですか。
    実行環境に依存するのかも知れませんが、僕の使う複数の環境では、var_dump() で表示後も止まることはありません。
    string(15) "q.hatena.ne.jp/"
    の様に表示した後、本来表示しているものが続きます。
    ("本来表示しているもの"を書き出す際に header() を使っていると、ヘッダを出す前に書き出される事になるので、設定によってはウォーニングが出ますが)

    $_POST にはpostで送られて来た値が連想配列として保存されているので、最初の表示時には当然NULLであるはずです。
    そのスクリプトを実行した時に表示されているフォーム(あるいはそのスクリプトを呼び出すフォーム)から何かポストされればそれが表示されるんでしょうけど、そこまで行かないのではテストも出来ませんねぇ。


    > 先日あるWEBアプリを日本語化しようとした時、エラーにはならないけど、動作が期待したものにならないことがあって...
    非マルチバイト語圏のものは、マルチバイトを全く考慮していないのも多いですよね。特に多いのが、マルチバイト文字を扱えない関数を使っているヤツで、修正は結構面倒ですよね。
    日本語をUTF-8で記述すればOKという場合もありますけどね。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません