「PHP」カテゴリーアーカイブ

エラーログを取りたい場合 (PHP)

PHPのエラーログを記録する場合はphp.iniに以下のように記述します。エラーを画面に直接出力してもよいのですが、セキュリティ的に望ましくありません。
さくらのレンタルサーバ非公式FAQより引用します。

display_errors="0"
error_reporting="2047"
log_errors="1"
error_log="/home/???????/www/phplog/php-error.log"

1行目:エラー情報を表示しないようにする。
2行目:出力するPHPエラーの種類を設定。2047はすべてのエラーを表示。
3行目:ログを保存する。
4行目:保存するディレクトリ。php-error.logのアクセス権の設定する。

simple_html_domのメモリリーク (PHP)

htmlのパースに便利なsimple_html_domはメモリリークのバグがある模様です。
適宜開放することが望ましいと思います。このサイトからの引用を下記に掲載します。

//対策版
$dom = new simple_html_dom;
$dom->load($strBuffer, true);
さまざまなDOM処理・・・
//使い終わったらclear
$dom->clear();

上記のようにインスタンスを作って処理後に明示的に開放することで対応します。

ファイルまたはURLから一気に文字列を取得 (PHP)

file_get_contentsはたった1行でファイルの内容を取得できます。
パラメータを指定することで、部分的に取得することもできます。

file_get_contents($filename);

同様にfile_put_contentsで、出力もたった1行です。

file_put_contents($filename, $text);

で$textを$filenameに書き込むことができます。

拡張子の直前に文字列を追加 (PHP)

ファイル名の変更など(rename等)で古いファイルに文字列を追加して、別名として残しておきたい場合、以下のような関数でファイル名を作成し、リネームを行うと便利です。
例えば、拡張子の前に_oldを追加する場合の関数です。

function add_filename($filename,$addtext){
	//拡張子の前に文字列を追加
	$pos  = strrpos($filename, '.'); // .が最後に現れる位置
	if ($pos){
		return(substr($filename, 0, $pos).$addtext.substr($filename, $pos));
	}else{
		return($filename.$addtext);
	}
}

上記を用いて、sample.txtをsample_old.txtに変換します。

$fn = 'sample.txt';
rename($fn,add_filename($fn,'_old'));

日付などを追加してみてもよいかと思います。

メールアドレスのチェック (PHP)

フォームなどから入力されたメールアドレスを示す文字列が妥当かどうかをチェックするための正規表現を使ったチェック関数です。

function valid_mail($email){
	if (preg_match("/^[_a-z0-9-]+(¥.[_a-z0-9-]+)*@[a-z0-9-]+([¥.][a-z0-9-]+)+$/i", $email)){
		return true;
	}else{
		return false;
	}
}

簡易的なものですが、ないよりはましということで。
docomoなどは少々イレギュラーなメールアドレスの取得を容認してきた過去があるので、あまり厳密にするのも現実的ではないかもしれません。

sendmailで改行が増える? (PHP)

PHPからsendmailを使ってメールを (メールフォームなどから) 送る際に、pop受信時のみ、改行がなぜか増えてしまうことがありました。Webメールなどではそういう現象なかったので調べてみましたが、改行コードの扱いの違いが原因らしいことがわかりました。
このサイトを参考に以下のように改行コードを修正、統一することで無事に解決しました。

$s = str_replace(array("\r\n", "\r"), "\n", $s);

例では文字列を$sとしています。上記の様に文字列中の改行コードを統一して対応しました。

異なる階層から、ライブラリを読み込む (PHP)

特定のディレクトリにライブラリ等を保存している場合、異なる階層から、includeしたいときがあります。
例えば、
/home/example/www
以下に
/lib
/a/b
/c
などがあり、/a/bや/cなど階層が異なるディレクトリにあるPHPスクリプトから/lib内のライブラリを読み込みたい場合は、

<?php
$lib = $_SERVER['DOCUMENT_ROOT'] . "/lib";
set_include_path(get_include_path() . PATH_SEPARATOR . $lib);
include( "hoge.php" );
?>

でincludeすることができます。
MobableTypeなど、記事をディレクトリで管理する場合などで、共通に使用できます。

imagecreatefromstring (PHP)

画像ファイルをバイナリデータとしてデータベースなどに保存した場合、下記のようにヘッダを加え、保存したデータを加えると、画像ファイルそのものをブラウザに出力することができます。

header("Content-Type: image/jpeg");

そのとき、何らかの処理をしたい場合は imagecreatefromstring を使うと便利です。本来であれば、テンポラリファイルを作成、加工、出力、テンポラリファイル削除、といった手順が必要になりますが、その手間を省くことができます。 テーブル名:TABLE、項目名:JPEG、ID:123の画像を横幅100pxに縮小して表示する場合の例です。 続きを読む imagecreatefromstring (PHP)

sortの挙動 (PHP)

配列の並び替えsortを使う際には、データの形式に注意しましょう。2 番目のパラメータの指定によって挙動は下記のように変化します。

  • SORT_REGULAR 通常通りに項目を比較
  • SORT_NUMERIC 数値的に項目を比較
  • SORT_STRING 文字列として項目を比較

文字列として入っていた数値を並び替える場合(たとえば少数など)は明示的にSORT_NUMERICとする必要があります。

sort($array,SORT_NUMERIC)

このようにして数値として並び替えます。

実行時間の測定 (PHP)

処理にかかる時間を計りたいときは以下のようにします。
どれくらい正確かは不明ですが、かなり細かく計測できます。

$start = microtime(TRUE);
//いろいろな処理
$stop = microtime(TRUE);
print ($stop-$start);

分単位または数十秒単位ならtime();でも可能です。

2015/1/28修正
microtime()の引数にTRUEを指定しました。デフォルトではFALSEが指定され、この場合、文字列として返されるため、引き算ができません。