Tag Archives: PHP

[PHP]エラーの発生箇所を特定する手法

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

PHP は基本的にエラー発生時にメッセージでどの行に問題があるかを指摘してくれますが、発生しているはずのエラーが画面に表示されない場合や、エラーにはならないものの変数におかしな値が入ってしまう場合や、Cron で動作するものや API のエンドポイントのように画面表示のないものなどは原因を特定しにくくなります。
そこで問題箇所の絞り込み方について幾つかの手法を紹介します。

エラーメッセージを表示する

基本的には php.ini ファイルで「display_errors = On」のようにしておくのが基本なのですが、何らかの事情でそれが出来ない場合は PHP ファイル中の ini_set() を使ってエラーを表示させます。

// エラー表示を有効にする
ini_set( 'display_errors', 1 );

// 全てのエラーを表示する
ini_set('error_reporting', E_ALL);

エラーメッセージをファイルに保存する

ブラウザ上でメッセージを確認できれば良いのですが、低確率で発生する場合や自動実行される Cron ジョブなどのスクリプトの場合エラーログの保存先を変更して好きな場所に保存するという手があります。

ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
ini_set('log_errors', 'On');

// ログの保存先
ini_set('error_log', __DIR__ . '/error.log');

変数の内容を確認する

var_dump() 関数を使うと変数に何が入っているか詳しく確認できます。null や空文字、 0 や false などもしっかりと区別されるので特定しやすくなります。

$foo = false;
var_dump($foo);

配列変数の内容をファイルに保存する

print_r() の第2引数に true を指定すると画面出力の代わりに結果を文字列として返す事ができます。
それを活用すると配列変数などの内容をファイルに保存することが出来ます。

file_put_contents("log.txt", print_r($_POST, true));

無関係の箇所をコメントアウトする

原始的ではありますが、「//」や「<!-- -->」を使って無関係に思える箇所をコメントアウトしていくと思わぬ箇所に潜む問題が見つかるかもしれません。括弧の閉じ忘れ等による unexpected end of file などの構文エラーの発生箇所特定にも有効です。

PHPのバージョンやモジュールがインストールされているか確認する

phpinfo(); を使うと PHP のバージョンやエクステンション(拡張機能)の一覧が出力されます。
PHP 本体が古すぎたり、ImageMagick などの必要な拡張モジュールがインストールされていないと正しく動作しないことがあります。ほかにもタイムゾーンが正しく設定されているかなども調べることが出来ます。

文字コード、改行コードを確かめる

基本的に PHP ファイルは UTF-8 の文字コードで保存することが推奨されています。保存の際に BOM(Byte Order Mark)が含まれていてはいけません。改行コードも Unix 系のサーバーであれば LF に統一すべきです。テキストエディタの設定を確かめておきましょう。

メモリ上限を増やしたりタイムアウト時間を伸ばす

プログラムは正しく書けていてもサーバー側でメモリ上限や実行時間に制限がかけられている場合があります。
サーバーによっては禁止されている場合もありますが、変更できる場合は次のようにします。

// メモリの上限
ini_set('memory_limit', '256M');

// POST によって扱えるサイズの上限
ini_set('post_max_size', '16M');

// アップロードできるファイルサイズの上限
ini_set('upload_max_filesize', '8M');

// 同時にアップロードできるファイルの最大数
ini_set('max_file_uploads', 20);

// 実行時間の最大値(秒)
set_time_limit(90);

Posted in PHP | Tagged | Leave a comment

[PHP]文字列の内容に応じて自動で色分けする

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

ユーザー名などの任意の文字列に対して文字色を自動で指定するサンプルを作りました。
同じ文字列に対しては常に同じ色が返ります。色の選択肢はあらかじめ用意し、その中から色が選ばれます。
色の選択肢が少ないと文字が異なっても同じ色が重複することになります。

<?php
$colors = ['#ee0000', '#3a9b00', '#006ecc', '#ff9000', '#000000'];

function stringToColor($str, $colors){
    $index = hexdec( substr(md5($str), 0, 15) ) % count($colors);
    return $colors[$index];
}
?>
<span style="color: <?php echo stringToColor('hello', $colors);?>">hello</span>

Posted in PHP | Tagged | Leave a comment

[PHP]次の土日(今週末)の日時を取得する

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

PHP で日付を扱う場合は基本的に DateTime クラスを使いますが、add() などを使って日時を操作するとオブジェクト自身が書き換えられてしまうため計算結果だけが欲しいという場合には向きません。
そのような場合 DateTimeImmutable クラスを使うと add() した場合新しい DateTimeImmutable オブジェクトを返すのでもともとのオブジェクトの日時を書き換えることなく日時計算の結果だけを取得できます。

<?php
$now = new DateTimeImmutable();    // 今日
$w = (int)$now->format('w');
$diff = 6 - $w;

$sat = $now->add(new DateInterval('P' . $diff . 'D'));
$sun = $now->add(new DateInterval('P' . ($diff + 1)  . 'D'));

echo $sat->format('Y-m-d');    // 土曜日
echo $sun->format('Y-m-d');    // 日曜日

ちなみに今日の日付などが DateTime オブジェクトの形で与えられている場合、次のようにして変換することも出来ます。

$date = new DateTime();
$mutable = DateTimeImmutable::createFromMutable( $date );

Posted in PHP | Tagged , | Leave a comment