この記事では、Apache や PHP でエラー報告を有効にする方法や、単純な PHP スクリプトに print ステートメントを戦略的に配置してより困難なバグの原因を見つける方法など、PHP アプリケーションをデバッグするさまざまな方法について説明します。また、リアルタイム構文解析機能を備えた柔軟な開発環境である Eclipse 用の PHPEclipse プラグイン、および PHPEclipse 用の DBG デバッガー拡張機能についても学習します。
はじめに
コーディング時に大幅な時間を節約できる PHP デバッグ手法が多数あります。効果的かつ基本的なデバッグ手法は、エラー報告を有効にすることです。もう 1 つの少し高度なテクニックには、print ステートメントの使用が含まれます。これは、実際に画面に表示される内容を表示することで、見つけにくいバグを正確に特定するのに役立ちます。 PHPEclipse は、一般的な構文エラーを強調表示する Eclipse プラグインで、デバッガーと組み合わせて使用してブレークポイントを設定できます。
設定
この記事で説明されている概念を学ぶには、PHP、Web サーバー、および Eclipse が必要です。デバッガー拡張機能は、PHP バージョン V5.0.3 をサポートします。
PHP で作成されたページを解析してブラウザに表示するには、Web サーバーが必要です。この記事ではApache2を使用しています。ただし、どの Web サーバーでも十分です。
この記事で紹介したデバッグ手法の一部を利用するには、Eclipse V3.1.1 とプラグイン PHPEclipse V1.1.8 をインストールする必要があります。 Eclipse には Java® テクノロジが必要なため、それもダウンロードする必要があります。
PHP デバッガ拡張モジュールも必要です。取り付けは少し面倒です。デバッガー拡張機能のインストール手順に慎重に従ってください。次に、php.ini ファイル内の、PHP 拡張機能のロードと構成を必要とする行をコメント アウトします。デバッガを使用する必要がある場合は、コメントを解除してください。
ダウンロード情報については、「リソース」を参照してください。次にエラーメッセージについてです。
エラーメッセージ
エラー メッセージは、開発者にとっての防御の最前線です。エラー メッセージを表示するように構成されていないサーバー上で PHP でコードを開発したい人はいません。ただし、コードをデバッグし、実行する準備ができたら、エラー レポートがオフになっていることを確認する必要があります。これは、サイト訪問者にエラー メッセージが表示されることを望まないためです。これにより、エラー メッセージを悪用するのに十分な情報が提供されてしまいます。サイトの弱点とサイトをハッキングします。
エラー メッセージは、エラーをスローまたは生成した正しいコード行を示すため、有利に使用することもできます。このように、デバッグは、生成されたエラーが表示される行番号をブラウザーで調べ、コード内のその行を検査することになります。後で、PHPEclipse プラグインが、その場で構文エラーに下線を引いたり、ファイルを保存するときに赤い "x" でマークしたりすることで、開発やデバッグ中に非常に役立つことがわかります。
まず、エラー報告を有効にし、php.ini ファイルでエラー報告のレベルを設定する方法を見てみましょう。次に、Apache の構成ファイルでこれらの設定をオーバーライドする方法を学びます。
PHPエラーレポート
php.ini ファイルには多くの構成設定があります。 Linux に PHP および Apache 2 をインストールする手順 (「参考文献」を参照) に記載されているように、php.ini ファイルを設定し、適切なディレクトリに配置しておく必要があります。 PHP アプリケーションをデバッグするときに注意すべき構成変数が 2 つあります。 2 つの変数とそのデフォルト値は次のとおりです:
これら 2 つの変数の現在のデフォルト値は、php.ini ファイル内で検索すると見つかります。 display_errors 変数の目的は明らかです。この変数は、エラーを表示するかどうかを PHP に指示します。デフォルト値はオフです。ただし、開発プロセスを容易にするために、この値をオンに設定します。
error_reporting 変数のデフォルト値は E_ALL です。この設定では、不適切なコーディング方法から無害なヒント、エラーに至るまで、あらゆるものが表示されます。 E_ALL は、ブラウザの出力を混乱させる小さな事柄 (変数が初期化されていないなど) についてのヒントも画面上に表示するため、開発目的には少し粒度が高すぎます。私が知りたいのはエラーと不適切なコーディング方法だけであり、無害なヒントは知りたいわけではありません。したがって、error_reporting のデフォルト値を次の値に置き換えてください:
重新启动 Apache,就全部设置好了。接下来,将学习如何在 Apache 上做同样的事。
服务器上的错误报告
依赖于 Apache 正在做的工作,在 PHP 中打开错误报告可能没法工作,因为在计算机上可能有多个 PHP 版本。有时很难区分 Apache 正在使用哪个 PHP 版本,因为 Apache 只能查看一个 php.ini 文件。不知道 Apache 正在使用哪个 php.ini 文件配置自己是一个安全问题。但是,有一种方法可以在 Apache 中配置 PHP 变量,从而保证设置了正确的出错级别。
而且,最好知道如何在服务器端设置这些配置变量,以否决或抢占 php.ini 文件,从而提供更高级别的安全性。
在配置 Apache 时,应该已经接触过
/conf/httpd.conf 中 http.conf 文件中的基本配置。
要做在 php.ini 文件中已经做过的事,请把下列各行添加到 httpd.conf,覆盖任何 php.ini 文件:
php_flag display_errors on
php_value error_reporting 2039
|
这会覆盖在 php.ini 文件中为 display_errors 已经设置的标志,以及 error_reporting 的值。值 2039 代表 E_ALL & ~E_NOTICE。如果愿意采用 E_ALL,请把值设为 2047。同样,还是要重启 Apache。
接下来,要在服务器上测试错误报告。
测试错误报告
如果启动了错误报告,会节约许多时间。PHP 中的错误会指向代码中的错误。请创建一个简单的 PHP 文件 test.php,并像清单 1 所示一样定义它。
清单 1. 一个最適化とデバッグのテクニックと PHP プログラマーのためのテクニック_PHP チュートリアル的简单 PHP
<?php print("The next line generates an error.<br>");
printaline("PLEASE?");
print("This will not be displayed due to the above error.");
?>
|
最初の print() ステートメントは、その内容を Web ブラウザーに表示します。ただし、2 番目のステートメントではエラーが生成され、Web ページに表示されます。これにより、図 1 に示すように、最後の print() ステートメントが機能しなくなります。
図 1. 生成エラー
エラー報告が有効になりました。次に、print ステートメントを使用してアプリケーションのデバッグを支援します。
print ステートメントの紹介
アプリケーションの機能上のバグはエラーを生成しないため、PHP アプリケーションをデバッグするために print または die ステートメントを適切に配置および使用する方法に関する知識は、あらゆるデバッグ戦略において大きな資産となります。 print ステートメントを使用すると、コード内で問題のあるステートメントの位置を絞り込むことができます。これらのステートメントには構文エラーはなく、バグではありませんが、コードの機能という点ではバグです。これらはエラーをスローしないため、発見してデバッグするのが最も難しいバグです。分かっているのは、ブラウザに表示されているコンテンツが希望のものではないか、データベースに保存したいコンテンツがまったく保存されていないことだけです。
GET リクエストを通じて送信されたフォーム データを処理しており、ブラウザに情報を表示したいと考えていますが、何らかの理由でデータが正しく送信されないか、GET リクエストからデータを正しく読み取ることができないとします。このタイプの問題をデバッグするには、print() または die() ステートメントを使用して変数の値が何であるかを知ることが重要です。
die() ステートメントはプログラムの実行を停止し、Web ブラウザにテキストを表示します。 die() ステートメントは、コードをコメントアウトしたくない場合や、エラーの前の情報とエラー メッセージのみを表示し、それ以降の情報は表示したくない場合に特に便利です。
PHP の print ステートメントを使用してこの概念をテストしてみましょう
デバッグには print ステートメントを使用します
プログラマーだった頃、Linux でアプリケーションを開発していましたが、どこにバグがあるのかを教えてくれる便利な GUI がなかったので、プログラムに print ステートメントを追加すればするほど、より多くの機能が失われることがすぐにわかりました。アプリケーションを使用すると、バグの範囲が 1 行に狭まる可能性が高くなります。別の PHP ファイル test2.php を作成し、リスト 2 に示すように定義します。
リスト 2. GET 経由で送信されたすべての変数を表示する
<?php $j = "";
print("この関数に送信されたすべての変数を取得しましょう ");
print("スクリプト v </p>
<p align="left"></p><div style="display:none;">
<span id="url" itemprop="url">http://www.bkjia.com/PHPjc/508474.html</span><span id="indexUrl" itemprop="indexUrl">www.bkjia.com</span><span id="isOriginal" itemprop="isOriginal">true</span><span id="isBasedOnUrl" itemprop="isBasedOnUrl">http://www.bkjia.com/PHPjc/508474.html</span><span id="genre" itemprop="genre">技術記事</span><span id="description" itemprop="description">この記事では、Apache や PHP でのエラー報告の有効化、単純な PHP スクリプトに print ステートメントを戦略的に配置することによる... </span>
</div> の検索など、PHP アプリケーションをデバッグするさまざまな方法について説明します。
<div class="art_confoot"></div>
|