WEBアプリ開発に関する技術を綴るブログ

php,js,apache,mysql,laravel,fuelphpあたりの技術

phpでの開発における開発手法

デバッグとは

プログラムのエラーを訂正したり、 プログラムが想定通りに動くかを確認すること。

php開発でどのような場面でデバッグするか

phpによくある下記のようなエラーログが出力されたら、デバッグを行う。

E_ERROR:致命的なエラー=>実行が中断される

Warning:警告=>実行は継続するが警告はする

Notice:注意=>実行は継続するが警告葉する

E_PARSE:シンタックスエラー=>実行されない

どんな手法があるのか

それぞれのやり方や特徴

関数(var_dump/print_r)

使い方はvar_dumpの中に変数を入れるだけ。 var_dump(変数)

<?php

$ceo = array('apple' => 'ティム・クック', 'google' => 'サンダー・ピチャイ');

$money = 100;

var_dump($ceo);

var_dump($money);

?>

にすると下記の結果となります。

array(2) { ["apple"]=> string(21) "ティム・クック" ["google"]=> string(27) "サンダー・ピチャイ" } int(100)

array()は、変数の内容がarray(配列)であることを示し、( )内には要素の数が表示されます。 今回はarray(2)なので、2つの配列が変数に入っている事を意味しています。 string()は、変数が文字列であることを示し、( )内にはそのバイト数が表示されます。 int()は変数が整数型であることを示し、( )内にはその数値が表示されます。

また、var_dump()の合わせ技として、exit;という命令もよく使います。 PHPスクリプトをそこで終了させたい場合は、exit;を使いましょう。

<?php

$ceo = array('apple' => 'ティム・クック', 'google' => 'サンダー・ピチャイ');

var_dump($ceo);

exit;

?>

print_rとの違い

<!DOCTYPE html>

<?php

$data = array("one",2,3,"four");

var_dump($data);

echo "
";

print_r ($data);

?>

下記一行目がvar_dumpによる情報、二行目がprint_rで表示された情報

array(4) { [0]=> string(3) "one" [1]=> int(2) [2]=> int(3) [3]=> string(4) "four" }

Array ( [0] => one [1] => 2 [2] => 3 [3] => four )

print_rでは配列であるという情報と、各要素の値だけが表示されています。

IDE統合開発環境

PhpStormを紹介します。

Phpstormの主な機能

shiftを2回で簡単に検索できる

f:id:tanaka19880312:20180902183634p:plain

画面の分割ができる(window/editor tabs/縦か横かボタン)

f:id:tanaka19880312:20180902184155p:plain

ファイルをお気に入り登録する。favorite(view/tool windows/favorite)

f:id:tanaka19880312:20180902185754p:plain

f:id:tanaka19880312:20180902185815p:plain

f:id:tanaka19880312:20180902185820p:plain

エディタの中でターミナルを使う(view/tool window/terminal)

f:id:tanaka19880312:20180902190507p:plain

f:id:tanaka19880312:20180902190518p:plain

定義元クラス定義や、変数・関数の宣言元へジャンプ

command + B command クリック

f:id:tanaka19880312:20180902191905p:plain

f:id:tanaka19880312:20180902191916p:plain

ログファイルの確認

PHPのエラーが書き出されるログがありますので、デバッグ時にはこれを確認していく。 ログファイルはphp_info()などで確認できます。 設定のlog_errorsがOnになっていれば、 設定のerror_logで指定されたファイルにログが書き出されます。

Laravel エラーログ

/Users/■■■■/Desktop/laravel2018/storage/logs/laravel.logにエラーログ が書き込まれている。

ver 5.6から、ログに関する設定ファイルが専用ファイルに切り出されました。 /Users/■■■■/Desktop/laravel2018/configの中にlogging.phpが入っている。

ver 5.5以下のバージョンはapp.phpにログ設定を記述します。

エラーメッセージを日本語化する

larval/config/app.php

81行目あたり「'locale'=>'en', → 'locale'=>'ja',にする

*デフォルトで'ja'になっていた。

FuelPHP エラーログ

ログファイルは、 config.php 内の属性 'log_path' で指定されたフォルダに配置されます。

また、パラメータとして 'log_threshold' 、 'log_date_format' を設定することができます。(FuelPHP公式より)

★log_threshold

FuelPHPには、4種類(error, warning, debug, info)のログレベルがある。

Fuel::L_NONE, Fuel::L_ERROR, Fuel::L_WARNING, Fuel::L_DEBUG, Fuel::L_INFO or Fuel::L_ALL

*記述方法

Log::error("errorログ");

Log::warning("warningログ");

Log::debug("debugログ");

Log::info('infoログ');

*出力レベルの変更

'log_threshold' => Fuel::L_ALL,

★log_path

ログファイルの配置場所 (フォルダが書き込み可能である必要があります) 。

log_fileで指定がない場合、"./YYYY/MM/DD.log" という形式で 1日 1つのログファイルが生成されます。 (デフォルトはnull)

/Applications/XAMPP/xamppfiles/htdocs/■■■■/fuel/■■■■/logs/2018/08に、 日付毎にログファイルが入っている。

設定ファイル

アプリケーションの基本設定は app/config/config.php で設定されています。

Applications/XAMPP/xamppfiles/htdocs/fuelphp-1.7/fuel/app/config/config.php

XdebugというPHPの外部ツール

XdebugPHPデバッグツール。

Xdebugをインストール,設定し、Phpstormを設定する。

どのようにデバッグできるのか

・ステップ実行の設定

不具合の原因を探すために、処理を1行ずつ実行

・var_dumpの出力結果を見やすくする

var_dumpが見やすく改行される

PHP変数を管理してるzval領域の状態を確認

PHP内部の変数は、すべてzvalと呼ばれるひとつの構造体で表現されている。

/Applications/XAMPP/xamppfiles/include/php/Zend/zend.h

・関数の呼び出し元を特定する

関数に問題が起こって、関数がファイルやクラス、関数から呼び出されていたとして、 どこから呼び出された時に問題が起こっているのかを確認するには、 呼び出し元を特定する必要があります。

・プロファイリングができる

統計情報を収集。実行された関数名、何回その関数が実行されたか、 どの関数の実行にどれくらい時間かかったかという情報。 コードのボトルネックを特定。 どこを修正すべきなのかが明確になる。 有効にするには、php.ini で xdebug.profiler_enable スイッチを Onにする

・リモートデバッグができる

ローカルシステムを使って、 リモートシステム上で実行するアプリケーションをデバッグする事が出来る

・エラー時のスタックトレースを確認

エラーが発生するまでの経緯(どんな処理をどの順番で)が示されており、

スタックトレースを解析することでエラーの発生箇所/発生原因を確認することが可能です。

他のデバッグ手法と比べて何が良いのか

・都度 var_dump(); を書くよりも素早く様々な情報を引き出せるので開発スピードが上がる。 (ログを仕込んだり、echoしたりなどの労力や時間を省く事ができる。)

・qcachegrindと組み合わせる事によって、 プロファイルデータを閲覧できるので、簡単にボトルネックが発見できる。

*使い終わったら設定をコメントアウトしてリロードする。

プロファイルデータのサイズは大きいので放っておくと大変になる。

;xdebug.profiler_enable = 1

;xdebug.profiler_output_dir = /tmp