7086


PHPをやり始めました。

私の場合、C言語やVisualBasicでの開発経験はあるのですが、Web系言語を扱うのは初めてです。  
比較的難易度の低いPHPと言われていますが、正直なところ難しいです！  
「何が難しいのか？」と言われても、適切な回答ができないほど理解ができていないです。

質問ですが、レンタルサーバーに設置したPHPのソースコードをデバッグするための最も良い方法は何でしょうか？  
（良いツールがあったら併せて教えてください）

個人的にはVisualBasicみたいに、ソースコードの途中にブレークポイントを仕掛けて、あとはF3だったかF5だったか忘れましたが、このキーを押せば処理の途中経過が目視でき、変数などに何の値が入っているか分かるようなタイプが好きです。  
ですので、かつてVisualBasicはよくできているなぁ、と思ったことがあります。  
余談失礼しました。

話は本題に戻りまして、今ところはPHPのソースコードをTeraPadで開いて、「たぶん、ココがＮＧなのかな？？」という感だけでソースコードを組み立てています。


CC BY-SA 3.0
2015-02-25T08:30:27.610
7068
2016-07-15T15:34:57.697
7634
question
php
PHPのデバッグ方法についてよい方法を教えてください。


IDEなどを使っている場合はデバッガなどいろいろあるかもしれませんが、  
僕自身は非常にシンプルな方法でデバッグしております。  
具体的には

[code]

    var_dump($test);die;
    
[/code]

これだけです。  
型と内部の値を出力して処理を停止します。  
処理を停止したくない場合は die; を取り除いてください。  
バグが発生していそうな少し上のところから実行していくと簡単にバグを発見することができます。  
流れを知りたい場合は、var_dump の前または後ろに適当な文言を先頭などにつけて  
と記載すればある程度流れも視えるかなと思っております。  
直接エラー箇所を指摘してくれるわけではありませんが、ほとんどの環境で実行できるのでおすすめです。


CC BY-SA 3.0
2015-02-25T09:03:28.503
7070
2015-02-25T09:03:28.503
7641
7068
answer


Webアプリケーションのデバッグで変数確認や処理経過の確認ですと  
[Monolog](https://github.com/Seldaek/monolog)というライブラリを利用してBrowserConsoleHandlerというログハンドラを利用すると、お使いのブラウザのコンソールログで任意のログが簡単に確認出来ますよ。

[composer](https://getcomposer.org/download/)というPHPのパッケージ管理ソフトを利用すると簡単にインストールできます。  
インストールに関しては[[PHP][Logging]Monologでロギングする |
本日も乙](http://blog.jicoman.info/2014/05/monolog/)様が詳しいです。

[code]

    $log = new Monolog\Logger('Logger');
    $log->pushHandler(new Monolog\Handler\BrowserConsoleHandler());
    $log->info("テスト");
    
[/code]

この状態でスクリプトにアクセスすると、chromeやfirefoxのコンソールログに任意の文字列が出力されますのでvar_dumpやprintで止めて画面の確認をせずに済みます。

また出力するログレベルのスレッショルドが決められますので、開発から稼働への移行、稼動からのデバッグも比較的簡単に行う事が出来ますよ。


CC BY-SA 3.0
2015-02-25T09:39:24.443
7072
2015-02-25T09:39:24.443
4271
7068
answer


C言語やVBでの開発経験があるとのことですが、有名どころで `==` と `===`
や型変換の話など、他の言語からすると思いもしない仕様になっていることがあります。PHPに限った話ではありませんが、自分が使う要素だけでも[言語リファレンス](http://php.net/manual/ja/langref.php)に目を通すことをお勧めします（日本語です）。

> レンタルサーバーに設置したPHPのソースコードをデバッグする

とありますが、可能であれば **ローカルに実行環境を用意する**
ことをお勧めします。万一問題が発生してもレンタルサーバーに影響を与えることを防げます。またデバッグに関わる設定を変更したり、後述する Xdebug
の導入といったことも自由に行えます。

XAMPP、EasyPHP、MAMPといったパッケージを使うと、「Webサーバ + PHP + MySQL +
...」という基本的な組み合わせを簡単に用意することができます。

* * *

VisualStudio のような高機能なデバッガを使いたいのであれば、PHPの拡張である Xdebug と統合開発環境である Eclipse PDT や
IntelliJ IDEA
などを組み合わせるのが定番でしょうか。他にもエラー時のスタックトレース表示など便利な機能がたくさんありますから、統合開発環境やリモートデバッグを使わない場合でも役に立つかと思います。

なお Xdebug はPHPの設定を変更する必要がありますから、レンタルサーバーでは利用できないかもしれません。

あとは他の方も書かれているように `var_dump` で変数の中身を表示したり、各種ログライブラリを使って記録を取ることになるかと思います。

`ParseError` に出くわすことが多ければ、 `php -l` で事前に構文チェックをするのもおすすめです。


CC BY-SA 3.0
2015-02-25T10:04:10.600
7073
2015-02-25T10:04:10.600
8000
7068
answer


>
> 個人的にはVisualBasicみたいに、ソースコードの途中にブレークポイントを仕掛けて、あとはF3だったかF5だったか忘れましたが、このキーを押せば処理の途中経過が目視でき、変数などに何の値が入っているか分かるようなタイプが好きです。

という部分については、

＞レンタルサーバーに設置したPHPのソースコードをデバッグする

ブラウザが応答を返している時点で全てのPHPの処理が終了していますので  
実現することは難しいです。というのもブレークポイントやウォッチという仕組みは、  
稼働中の動作を一時的に止めて確認しているためです。  
（リモートデバッガそのものは否定しないのですが。出来る環境にあるかと言われると疑問です）

なので一般的には、ローカル環境でサーバーを構築します。(Eclipse+Xdebugが有名です)

> 個人的にはVisualBasicみたいに、

の点を最も重視すると。  
PHP Tools for Visual Studioとか。VS.Phpという選択肢が出てきます。  
この場合、IDEがIIS立ち上げてくれたりするので考えることは少ないのですが。こう、懐が…ね。


CC BY-SA 3.0
2015-02-25T10:26:07.313
7076
2015-02-25T10:26:07.313
8335
7068
answer


`var_dump()` でのデバッグ方法が出ているので、同じ方法でも具体的にコードを交えて実践的(?)な方法をご紹介したいと思います。

それは、PHP の標準関数である `debug_backtrace()` を使うものです。  
解説は本家にお任せします。要は関数やメソッドの実行履歴を行数まで絞って追うことができます。[PHP公式
debug_backtrace()](http://php.net/manual/ja/function.debug-backtrace.php)

以下に例を挙げます。

[code]

    /**
     * debug_backtrace() の結果をスリム化する.
     *
     * @param array $backtrace_array debug_backtrace() の返り値.
     * @param int $trace_level トレースする深さ.
     * @return array スリム化したトレース情報. 
     */
    function backtrace( array $backtrace_array, $trace_level=1 ) {
        $array_count = count($backtrace_array);
        $trace_level = ($array_count>=$trace_level) ? $trace_level : $array_count;
        for($i=0; $i<$trace_level; $i++) {
            if( isset($backtrace_array[$i]['file']) ) {
                $traces[$i] = $backtrace_array[$i]['file'].':'.$backtrace_array[$i]['line'];
            } else {
                $traces[$i] = $backtrace_array[$i]['class'].'::'.$backtrace_array[$i]['function'];
            }
        }
        return $traces;
    }
    
    /**
     * デバッグ表示.
     *
     * @param mixed $var 表示したい変数.
     * @param int $trace_level トレースする深さ.
     * @param string $style tracer() で表示した時の HTML スタイル.
     */
    function tracer( $var, $trace_level=1, $style='color:#000; background-color:#CCC' ) {
        $trace = backtrace( debug_backtrace(), $trace_level );
        echo "<pre style=\"$style\">";
        foreach( $trace as $info )
        {
            echo $info.PHP_EOL;
        }
        var_dump( $var );
        echo "</pre>";
    }
    
[/code]

そして、試しに使ってみます。

[code]

        $numbers = [1,2,3,4,5,6,7,8,9];
        tracer($numbers,10);
    
[/code]

表示結果は以下の通りとなります。(CakePHP の適当な場所で実行しました)  
![tracer screanshot](https://i.stack.imgur.com/8G0IT.gif)

`var_dump()` の実行結果と、`debug_backtrace()` の実行結果がくっついて表示されています。  
この tracer() が実行されたのは、`/app/src/Controller/AppController.php` の 76
行目であることが分かるわけです。

こんな感じで自分の使いやすい、もしくはプロジェクトにあった debug 用の機能を作ると良いと思います。  
但し、この機能や `var_dump()` 、`print_r()`
を用いたコード内に埋め込むようなデバッグコードは本番環境でそれを表示し無いような小細工をしないと面倒くさいことになりかねませんのでご注意ください。


CC BY-SA 3.0
2015-02-25T14:05:44.767
7086
2015-02-25T14:05:44.767
7926
7068
answer


ブレイクポイントをしかけて実行させてデバッグするようなことは、xdebugという拡張機能をIDEと連携させることで出来ます。xdebugでググッてみて下さい。対応したエディタなりIDEで試してみて下さい。


CC BY-SA 3.0
2016-07-15T15:34:57.697
27652
2016-07-15T15:34:57.697
7068
answer