デバッグし易くしよう! 1: 処理を表示する

はじめに

プログラムにデバッグ向けのコードを入れておくと、開発時はもちろん、運用開始後も、何か問題が発生した場合に、それが、コーディングの問題なのか、データの問題なのか、あるいはTwitter側の問題なのかを切り分ける作業と判断に必要な時間を大幅に短縮できます。
しかし、案外PHPの入門書にも、ネットを見渡してみてもまとまった説明が見当たらないようでしたので、いくつか簡単なものをご紹介してみることにしました。
なお、自分の環境が PHP5であるため前提が PHP5となってしまう点はご了承ください。

サンプル・コード

 デバッグ・コードを追加していくサンプルとして、今回は以下のfopenを利用してTwitterのステータスを更新するコードを利用してみます。

<pre>
<?php
//ユーザー名、パスワード
$username='Twitterユーザ‐名';
$password='Twitterパスワード';

$message='テストメッセージ!!';

$ret= tweet_fop($message, $username, $password);

exit(); //プログラム終了

//fopenを利用したtweet function
function tweet_fop($message, $username, $password)
{
    $url = "http://twitter.com/statuses/update.json?";
    $params = "status=". rawurlencode($message);

    $st = stream_context_create(array(
        "http" => array(
            "method" => "POST",
            "header" => "Authorization: Basic ". base64_encode($username. ":". $password)
        )
    ));

if(($fp = fopen($url.$params, 'r', false, $st)) == false){
      return(false);
}
$contents=stream_get_contents($fp);
fclose($fp);
return ($contents);

}
?>
</pre>

しかし、上のプログラムを実行しても、画面上には何も表示されず、Twitter側を確認して、初めて上手くステータスの更新が出来たのか否かが分かります。


Step1 : どの処理が行われたか表示

例えば、Web経由でツイッターにアクセスした場合でも、手動で”投稿”ボタンを押してもなかなか反映されずに終わってしまう経験をされた方も多いのではないでしょうか?
サンプル・プログラムも特に問題がなければ、すぐにexit()処理に辿りつきますが、もし何か問題が生じていると中々処理が終わらない場合もあるかもしれません。
もし、現在どの処理が実行中かを表示できれば、処理が順調に進んでいるのか、どこかで引っかかってしまっているのか簡単に分かりますね!
・・・という訳でいくつか echo 文を追加してみます。

<?php
echo "プログラム開始<br>";
//ユーザー名、パスワード
$username='Twitterユーザ‐名';
$password='Twitterパスワード';

echo "     ユーザー名、パスワードセット完了<br>";

$message='投稿テストメッセージ!!';
echo "     投稿メッセージのをセット完了<br>";

$ret= tweet_fop($message, $username, $password);

echo "プログラム終了<br>";
exit();


//fopenを利用したtweet function
function tweet_fop($message, $username, $password)
{
echo "     関数tweet_fop:START<br>";

    $url = "http://twitter.com/statuses/update.json?";
    $params = "status=". rawurlencode($message);

    $st = stream_context_create(array(
        "http" => array(
            "method" => "POST",
            "header" => "Authorization: Basic ". base64_encode($username. ":". $password)
        )
    ));

echo "     fopen実行<br>";

if(($fp = fopen($url.$params, 'r', false, $st)) == false){
echo "     fopen 失敗のため 関数tweet_fopから戻る<br>";
      return(false);
}

echo "     fopen成功<br>";

$contents=stream_get_contents($fp);

echo "     fclose実行<br>";
fclose($fp);

echo "     関数tweet_fop:END<br>";
return ($contents);

}
?>

これを実行すると、正常に処理が進んだ場合は下のように画面にメッセージが表示され、処理が最後まで正常に進んだことが確認できます。

プログラム開始
     ユーザー名、パスワードセット完了
     投稿メッセージのをセット完了
     関数tweet_fop:START
     fopen実行
     fopen成功
     fclose実行
     関数tweet_fop:END
プログラム終了

以降こんな感じで少しづつ デバッグのためにプログラムに追加してみると良さそうなことをまとめて見たいと思います。