ホームページ >バックエンド開発 >PHPチュートリアル >PHP プログラマーのためのデバッグ手法
目次
はじめに エラー メッセージの設定 print ステートメントの紹介 PHPeclipse の使用 デバッガーの使用 まとめ ダウンロード リソース 著者について
PHP プログラマーのためのデバッグ テクニック
print ステートメント、エラー報告、および PHPeclipse プラグインの使用
Tyler Anderson ( mailto:tyleranderson5@yahoo.com?subject=PHP プログラマーのためのデバッグ技術&cc=troy@backstopmedia.com)、フリーランス ライター
Tyler Anderson は、両方の学士号を取得しています。 2004 年にコンピュータ サイエンスの博士号を取得し、修士号を取得しました。 2005 年にブリガム ヤング大学で電気およびコンピュータ工学の学士号を取得。 Tyler は、IBM developerWorks および DevX 向けに多数の記事とチュートリアルを作成し、コーディングしてきました。
概要: Apache や PHP でエラー報告を有効にすることや、戦略的な print ステートメントを配置して、簡単なサンプル PHP スクリプトを通じてより困難なバグの原因を特定することなど、PHP アプリケーションをデバッグするためのさまざまな方法を検討します。リアルタイム構文解析機能を備えた洗練された開発環境である Eclipse 用の PHPeclipse プラグインと、PHPeclipse 用の DBG デバッガー拡張機能についても説明します。
これにタグを付けてください!
日付: 2005 年 11 月 29 日
レベル: 入門
アクティビティ: 36162 ビュー
Capture_referrer();
はじめに
コーディング時に膨大な時間を節約できる PHP デバッグ手法が多数あります。効果的だが基本的なデバッグ手法は、単純にエラー報告を有効にすることです。もう 1 つのもう少し高度なテクニックには、print ステートメントの使用が含まれます。これは、実際に何が起こっているかを画面上に表示することで、よりとらえどころのないバグを正確に特定するのに役立ちます。 PHPeclipse は、一般的な構文エラーを強調表示し、デバッガーと組み合わせて使用してブレークポイントを設定できる Eclipse プラグインです。セットアップ
この記事で説明されている概念を学ぶには、Web アプリケーションである PHP が必要です。サーバー、および Eclipse。デバッガー拡張機能でサポートされる PHP の最新バージョンは V5.0.3 です。
PHP で作成したページを解析してブラウザに表示するには、Web サーバーが必要です。この記事では Apache V2 を使用します。ただし、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 V2 のインストール」ドキュメント (「参考文献」を参照) の指示に従って、php.ini ファイルをセットアップし、適切なディレクトリに配置しておく必要があります。 PHP アプリケーションをデバッグするときに知っておくべき構成変数がいくつかあります。以下にデフォルト値を示します:
display_errors = Off error_reporting = E_ALL |
これらの変数の現在のデフォルト値は、php.ini ファイル内で検索することで確認できます。 display_errors 変数の目的は自明です。この変数は、エラーを表示するかどうかを PHP に指示します。デフォルト値はオフです。ただし、開発プロセスを容易にするために、Off を置き換えてこの値を On に設定します。
display_errors = On |
error_reporting 変数のデフォルト値は E_ALL です。これには、不適切なコーディング方法から無害な通知、エラーに至るまで、あらゆるものが表示されます。 E_ALL は、初期化されていない変数などの小さな事柄について画面上に通知を表示することでブラウザ出力を乱雑にするため、開発プロセスにおいて私の好みには少しうるさすぎます。私はエラーや不適切なコーディング方法は見たいと思っていますが、無害な通知は見たくないのです。したがって、error_reporting のデフォルト値を次のように置き換えます。
error_reporting = E_ALL & ~E_NOTICE |
Apache を再起動すれば、準備は完了です。次に、Apache で同じことを行う方法を学びます。
サーバーでのエラー報告
Apache の動作によっては、コンピューター上に複数の PHP バージョンがある可能性があるため、PHP でエラー報告をオンにすると機能しない場合があります。 。 Apache は 1 つの php.ini ファイルしか参照できないため、Apache がどの PHP バージョンを指しているのかを判断するのが難しい場合があります。 Apache が自身の設定にどの php.ini ファイルを使用しているかわからないことは、セキュリティ上の問題です。ただし、正しいエラー レベルの設定を保証するために Apache で PHP 変数を構成する方法があります。
また、サーバー側でこれらの構成変数を設定して php.ini を拒否またはプリエンプトする方法を知っておくと良いでしょう。ファイルを作成して、より高いレベルのセキュリティを提供します。
Apache を設定したときに、14877208001853a2f96d4f134db446ac/conf/httpd.conf にある http.conf ファイルで基本的な設定をすでにいじっているはずです。
php.ini ファイルで行ったのと同じように、次の行を httpd.conf に追加して、すべての php.ini ファイルをオーバーライドします。 php.ini ファイル内と、error_reporting の値。値 2039 は、E_ALL および ~E_NOTICE を表します。 E_ALL を使用したい場合は、代わりに値を 2047 に設定します。繰り返しますが、必ず Apache を再起動してください。
エラー報告のテスト |
php_flag display_errors on php_value error_reporting 2039
The first print() statement should display its contents to the Web browser. However, the second statement generates and displays an error to the Web page. This results in the last print() statement do nothing, as shown in Figure 1.
You have error reporting turned on! Next, we use print statements to help debug applications.
Back to top
Introducing print statements
Because functional bugs in your application don't generate errors, knowledge on how to accurately place and use print or die statements to debug your PHP application can be a great asset in your arsenal of debugging strategies. You can use print statements to narrow down the locations of problem statements in your code that may not be syntactically incorrect or bugs in the code, but they are bugs in the functionality of your code. These are the hardest bugs to find and debug because they throw no errors. You only know that what is being displayed to the browser isn't what you intended, or that what you thought was being stored in your database isn't being stored at all.
Suppose you are processing form data sent in via a GET request and want to display the information to the browser, but for whatever reason, the data is either not being submitted properly, or it isn't being read from the GET request properly. To debug such a problem, it's important to know what the value of the variable is, using a print() or a die() statement.
The die() statement halts program execution and displays text to the Web browser. The die() statement is particularly useful if you don't want to have to comment out your code, and you only want everything up to the error and the error displayed and nothing after.
Let's test this concept of using print statements in PHP.
Debugging using print statements
In my years as a programmer where I developed applications on Linux® boxes with no handy GUI to tell me where my bugs were, I quickly caught on that the more print statements I laced my program with the more chances I had of narrowing down the bugs in my application to a single line. Create another PHP file, test2.php, and define it as shown in Listing 2.
<?php $j = ""; print("Lets retrieve all the variables submitted to this "); print("script via a GET request:<br>"); foreach($_GET as $key => $i){ print("$key=$j<br>"); } if($_GET['Submit'] == "Send GET Request") $j = "done!<br>"; ?> <form method="GET"> Name: <input name="name"><br> Email: <input name="email" size="25"><br> <input name="Submit" type="submit" value="Send GET Request"> </form> |
You may be able to spot the bug in Listing 2 very easily. Good for you! Note that this is a simple script, and is shown as an example in using print statements to debug. The script simply takes all variables in the GET request, if any, and displays them back to the browser. A form is also supplied for you to send variables to the server using a GET request for testing. See the output, as shown in Figure 2.
Now click the Send GET Request button. Notice that only the keys of the $_GET request got displayed to the browser, and the correct values did not. You can place a print statement within the loop to verify that data indeed exists at each element in the foreach loop. See Listing 3.
... foreach($_GET as $key => $i){ print("Correct data? " . $_GET[$key] . "<br>"); print("$key=$j<br>"); } ... |
The placed print statement is in bold font. Notice that you already know that the displayed $key values on the Web browser are correct, but for some reason, the values aren't being displayed correctly. See the new output, as shown in Figure 3.
Now you know that your application is receiving the variables in the GET request correctly, so there must be a bug in your code. You look over and notice that the variable you are using for displaying the values, $j, is the wrong one. You specified $i in the foreach statement, which must have the correct values, but you accidentally typed in $j. You quickly fix the problem by replacing $j with $i and see the correct output by reloading the page, as shown in Figure 4.
You can now remove or comment out the print statement you added because you have discovered the bug in your code. Notice that this is a small subset of the many errors you might experience while debugging your application. A good solution to a problem you may encounter when working with a database is to print out your SQL statements to make sure that what you are executing SQL you intended to execute.
Now you'll take a look at using the Eclipse IDE and the PHPeclipse plug-in and debugger extension to further aid you in your debugging ventures.
Back to top
Using PHPeclipse
You have probably used Eclipse, but you aren't familiar with it. See Resources for introductions to the Eclipse platform.
The PHPeclipse plug-in for Eclipse is a popular tool used for developing PHP applications. Start Eclipse and specify your workspace directory as the www directory for Apache (c:\www on my machine). Now click on File > New > Project. The New Project wizard will pop up. Double-click on the PHP folder and select PHP Project. Click Next, enter a project name, debugArticle, and click Finish.
If you set up your Web server to listen to port 80, you don't need to change anything. Otherwise, go to the Navigator window and right-click on your PHP project, debugArticle. Select Properties, then click PHP Project Settings. Click Configure Workspace Settings and change localhost appropriately or add the port your Web server is listening on (http://localhost:8080, for example). Click Apply and you're set.
The Navigator Window should display your project and a single .project file. Right-click on your project as you did before, except this time select New > PHP File. Replace *.php with the name of the PHP file you want to create, test3.php, and click Finish. A new file should appear in the Eclipse IDE. You may have to navigate the bottom window to the PHP Browser to view the current output of your PHP file (see Figure 5).
Note that only Windows® users can use the PHP browser as shown in Listing 5. The exact same functionality can be used by opening up a separate browser window and pointing your browser to the directory where your test scripts are located.
Now let's demo this application and prove its awesome capabilities.
In the Using the debugger section, you will learn how to debug your PHP application using Eclipse, PHPeclipse and the debugger PHP extension downloaded earlier. You'll start by learning how to use its syntax parsing abilities.
Syntax parsing and underlining
Let's start by seeing how PHPeclipse provides you with real-time syntax parsing abilities to assist you with debugging PHP applications. To see this feature in action, start by defining the test3.php file in Eclipse, as shown below.
<?php print(,"Hello World!"); ?> |
Notice that two characters underlined in Listing 4 get underlined in Eclipse, notifying you of incorrect syntax. Saving the file by pressing Ctrl+S displays the Parse error in Eclipse by placing a red "x" by the line that matches the parse error in your code, as shown in Figure 6.
Now let's demo the PHP browser. This window gives you a preview of the current PHP script, as shown in Figure 6.
Remove the comma (,) from test3.php, defined above. Save the file by pressing Ctrl+S, and watch the PHP browser window update by displaying Hello World (see Figure 7).
Next up is setting breakpoints in PHP using the debugger.
Back to top
Using the debugger
Using the debugger, you can set breakpoints and see the browser output from your PHP code up to the breakpoint you set. You can then resume code execution and see the rest of the browser output up to the next breakpoint and the next until your PHP script has completed.
Uncomment the lines you commented out in the php.ini file in the Setting up section and restart Apache. The debugger is loaded, and Eclipse will be able to hook into it.
Now let's set up the debug environment in Eclipse. Create a new test4.php file and leave it empty for now. Now click Run > Debug. Select PHP DBG Script on the left-side panel and click New. Now go to the File tab, and type in your current project, debugArticle, and the file you want to debug, test4.php. Now go to the Environment tab, then to the Interpreter subtab. Browse for your php.exe file in your PHP install directory (mine is c:\apps\php5.0.3\php.exe). Now click on the Remote Debug subtab, select Remote Debug, and if you're not using Windows, uncheck the "Open with DBGSession URL in internal Browser box." Set the Remote Source path equal to the absolute path (not the Web path) to the PHP script you're going to test (I have mine set to c:\www\debugArticle\test4.php). Now click Debug.
The Debug perspective should load, as shown in Figure 8. Otherwise, click Window > Open Perspective > Other, and select Debug.
Now you're ready to set breakpoints.
With the versions of the plug-in and extension used in this article, a breakpoint function is required because PHP buffers output before sending it to the browser. Besides that, you need to do more than set a breakpoint to flush the current display data to your Web browser, so define your test4.php file, as shown below and in Figure 8 above.
<?php function break-point(){ ob_flush(); flush(); sleep(.1); debugBreak(); } print("This will get shown first, "); print("as will this<br>"); breakpoint(); print("This won't get shown until after "); print("continuing the break-point<br>"); breakpoint(); print("END!"); ? |
breakpoint() 関数は、バッファされた出力データとその他のバッファされたデータを Web ブラウザにフラッシュします。 sleep(.1) の呼び出しは、debugBreak() でコードの実行が停止する前に、サーバーが Web ブラウザにデータをフラッシュするのに十分な時間を確保するために必要です。debugBreak() は、前にダウンロードした PHP デバッガ拡張機能の内部で知られている関数です。したがって、breakpoint() を呼び出すと、HTML ブロック、print() ステートメント、および echo() ステートメントからデータがブラウザーにフラッシュされ、コードの実行が停止します。
リスト 4 に示すコードを記述した後、ブラウザーを開いて、 test4.php または、PHP ブラウザ ウィンドウ (私の場合は http://localhost/debugArticle/test4.php) を参照することもできます。ファイルを入力して保存するたびに、PHP ブラウザ ウィンドウでデバッグ シーケンスがすでに開始されています。 Windows を使用していない場合は、ブラウザから test4.php を参照してください。ファイルを保存した後、F8 キーを押すか、[実行] > [実行] をクリックしてコードの実行を再開します。再開する。 END が表示されるまでこれを実行してください。出力の最後の行として表示されます (図 9、10、および 11 を参照)。
図 9 の [デバッグ] ウィンドウに、実行出力が中断されていることがどのように表示されているかに注目してください。
図 10 の [デバッグ] ウィンドウでは実行が中断されたままであり、2 番目のデータセットが PHP ブラウザーに表示されます。のデバッグ ウィンドウでコードが中断されていないことに注目してください。図 11 と、図 11 の PHP ブラウザーに示すように、スクリプト全体が実行されました。
概要
これで、エラー報告、print ステートメント、PHPeclipse、およびデバッガー拡張機能の使用を PHP のデバッグ手法の武器に追加できたので、その数を減らすことで、より効率的な PHP プログラマーになれるでしょう。コード行ごとに作成されるエラーの数。新しいスキルをテストするための PHP チュートリアルについては、「リソース」を参照してください。
トップに戻る
ダウンロード
PHP デバッグ用のサンプル コード
HTTP |