PHP

【PHP】ファイル操作を行う際の注意メモ。

自分用。

ファイルの最終更新時間をtouch()などで更新した後、再度取得する際はファイルのステータスキャッシュをクリアしてやる必要がある。

$filePath = '/path/to/targetFile.ext';

echo date('Y-m-d H:i:s', filemtime($filePath))."\n";

touch($filePath);

echo date('Y-m-d H:i:s', filemtime($filePath))."\n";

clearstatcache();

echo date('Y-m-d H:i:s', filemtime($filePath))."\n";
↓
2013-08-24 09:27:54
2013-08-24 09:27:54
2013-08-24 09:32:05

出力結果の2行目でもわかる通り、touch()にてファイルの最終更新日時を変更しているにもかかわらず、キャッシュの所為で更新前の値が取得されてしまっている。
ファイル操作周りの関数を実行した後は、正しい値を取得するためにもキャッシュの挙動には十分注意されたし。

ちなみにtouch()で最終更新日時を更新できることを始めて知った。

【PHP】round()で少数を丸める際、指定できるオプションまとめ。

浮動小数点をround()で丸めた時、通常は四捨五入された値が返されるが、第3引数に動作モードを指定してやることで、丸め方を指定することが出来る。

ちなみに第2引数は丸め込みたい桁数を指定する。

echo round(5.4); // 5
echo round(5.5); // 5
echo round(1.234567, 3); // 1.235
echo round(1234567, -3); // 1235000
echo round(5.5, 0, PHP_ROUND_HALF_UP); // 6
echo round(5.5, 0, PHP_ROUND_HALF_DOWN); // 5
echo round(5.5, 0, PHP_ROUND_HALF_EVEN); // 6
echo round(5.5, 0, PHP_ROUND_HALF_ODD); // 5
echo round(5.555, 2, PHP_ROUND_HALF_EVEN); // 5.56
echo round(5.555, 2, PHP_ROUND_HALF_ODD); // 5.55

モードの詳細は以下の通り。

定数 詳細
PHP_ROUND_HALF_UP 端数を切り上げ
PHP_ROUND_HALF_DOWN 端数を切り捨て
PHP_ROUND_HALF_EVEN 端数を偶数に丸め込む
PHP_ROUND_HALF_ODD 端数を奇数に丸め込む

「PHP_ROUND_HALF_EVEN」、「PHP_ROUND_HALF_ODD」に関しては多少理解しづらいかもしれないが、
値がど真ん中であれば偶数/奇数に丸め、それ以外は近い方に丸めるという処理が行われる。
よって5.4の場合、出力はいずれのモードであっても5になり、5.6であれば6ということになる。
5、5.5、12.55、など「.5」のように値が中央になりうる場面において、どっちに丸め込むかを指定することが出来るということである。

 

【PHP】文字列が全角漢字であるかを調べる。

正規表現で常用漢字かどうかを判断できるらしいので調べてみた。

$str = '山田五郎';
$regex = '^[一-龠]+$';
$res = mb_ereg_match($regex, $str);

var_dump($res);
↓
bool(true)

$regexの部分はよく「’^[亜-腕弌-熙]+$’」という指定方法が紹介されているが、UTF-8環境の場合上記のような指定にすることで全ての漢字にマッチさせることが可能とのこと。これは便利だね。

【PHP】サポートされているエンコーディング一覧を取得する。

前回の記事←に引き続き一覧取得系関数。

文字コード周りで嵌った時の手助けになりそう。

$list = mb_list_encodings();
var_dump($list);
↓
array(73) {
  [0]=>
  string(4) "pass"
  [1]=>
  string(4) "auto"
  [2]=>
  string(5) "wchar"
  [3]=>
  string(7) "byte2be"
  [4]=>
  string(7) "byte2le"
  [5]=>
  string(7) "byte4be"
  [6]=>
  string(7) "byte4le"
  [7]=>
  string(6) "BASE64"
  [8]=>
  string(8) "UUENCODE"
  [9]=>
  string(13) "HTML-ENTITIES"
  [10]=>
  string(16) "Quoted-Printable"
  [11]=>
  string(4) "7bit"
  [12]=>
  string(4) "8bit"
  [13]=>
  string(5) "UCS-4"
  [14]=>
  string(7) "UCS-4BE"
  [15]=>
  string(7) "UCS-4LE"
  [16]=>
  string(5) "UCS-2"
  [17]=>
  string(7) "UCS-2BE"
  [18]=>
  string(7) "UCS-2LE"
  [19]=>
  string(6) "UTF-32"
  [20]=>
  string(8) "UTF-32BE"
  [21]=>
  string(8) "UTF-32LE"
  [22]=>
  string(6) "UTF-16"
  [23]=>
  string(8) "UTF-16BE"
  [24]=>
  string(8) "UTF-16LE"
  [25]=>
  string(5) "UTF-8"
  [26]=>
  string(5) "UTF-7"
  [27]=>
  string(9) "UTF7-IMAP"
  [28]=>
  string(5) "ASCII"
  [29]=>
  string(6) "EUC-JP"
  [30]=>
  string(4) "SJIS"
  [31]=>
  string(9) "eucJP-win"
  [32]=>
  string(8) "SJIS-win"
  [33]=>
  string(5) "CP932"
  [34]=>
  string(7) "CP51932"
  [35]=>
  string(3) "JIS"
  [36]=>
  string(11) "ISO-2022-JP"
  [37]=>
  string(14) "ISO-2022-JP-MS"
  [38]=>
  string(12) "Windows-1252"
  [39]=>
  string(12) "Windows-1254"
  [40]=>
  string(10) "ISO-8859-1"
  [41]=>
  string(10) "ISO-8859-2"
  [42]=>
  string(10) "ISO-8859-3"
  [43]=>
  string(10) "ISO-8859-4"
  [44]=>
  string(10) "ISO-8859-5"
  [45]=>
  string(10) "ISO-8859-6"
  [46]=>
  string(10) "ISO-8859-7"
  [47]=>
  string(10) "ISO-8859-8"
  [48]=>
  string(10) "ISO-8859-9"
  [49]=>
  string(11) "ISO-8859-10"
  [50]=>
  string(11) "ISO-8859-13"
  [51]=>
  string(11) "ISO-8859-14"
  [52]=>
  string(11) "ISO-8859-15"
  [53]=>
  string(11) "ISO-8859-16"
  [54]=>
  string(6) "EUC-CN"
  [55]=>
  string(5) "CP936"
  [56]=>
  string(2) "HZ"
  [57]=>
  string(6) "EUC-TW"
  [58]=>
  string(5) "BIG-5"
  [59]=>
  string(6) "EUC-KR"
  [60]=>
  string(3) "UHC"
  [61]=>
  string(11) "ISO-2022-KR"
  [62]=>
  string(12) "Windows-1251"
  [63]=>
  string(5) "CP866"
  [64]=>
  string(6) "KOI8-R"
  [65]=>
  string(6) "KOI8-U"
  [66]=>
  string(9) "ArmSCII-8"
  [67]=>
  string(5) "CP850"
  [68]=>
  string(6) "JIS-ms"
  [69]=>
  string(7) "CP50220"
  [70]=>
  string(10) "CP50220raw"
  [71]=>
  string(7) "CP50221"
  [72]=>
  string(7) "CP50222"
}

【PHP】サポートされているハッシュアルゴリズム一覧を取得する。

ちょっと面白かったのでメモ。

普段md5かsha512くらいしか使わないけど、今後は積極的に色々とためしてみようかな。

$list = hash_algos();
var_dump($list);
↓
array(42) {
  [0]=>
  string(3) "md2"
  [1]=>
  string(3) "md4"
  [2]=>
  string(3) "md5"
  [3]=>
  string(4) "sha1"
  [4]=>
  string(6) "sha224"
  [5]=>
  string(6) "sha256"
  [6]=>
  string(6) "sha384"
  [7]=>
  string(6) "sha512"
  [8]=>
  string(9) "ripemd128"
  [9]=>
  string(9) "ripemd160"
  [10]=>
  string(9) "ripemd256"
  [11]=>
  string(9) "ripemd320"
  [12]=>
  string(9) "whirlpool"
  [13]=>
  string(10) "tiger128,3"
  [14]=>
  string(10) "tiger160,3"
  [15]=>
  string(10) "tiger192,3"
  [16]=>
  string(10) "tiger128,4"
  [17]=>
  string(10) "tiger160,4"
  [18]=>
  string(10) "tiger192,4"
  [19]=>
  string(6) "snefru"
  [20]=>
  string(9) "snefru256"
  [21]=>
  string(4) "gost"
  [22]=>
  string(7) "adler32"
  [23]=>
  string(5) "crc32"
  [24]=>
  string(6) "crc32b"
  [25]=>
  string(7) "salsa10"
  [26]=>
  string(7) "salsa20"
  [27]=>
  string(10) "haval128,3"
  [28]=>
  string(10) "haval160,3"
  [29]=>
  string(10) "haval192,3"
  [30]=>
  string(10) "haval224,3"
  [31]=>
  string(10) "haval256,3"
  [32]=>
  string(10) "haval128,4"
  [33]=>
  string(10) "haval160,4"
  [34]=>
  string(10) "haval192,4"
  [35]=>
  string(10) "haval224,4"
  [36]=>
  string(10) "haval256,4"
  [37]=>
  string(10) "haval128,5"
  [38]=>
  string(10) "haval160,5"
  [39]=>
  string(10) "haval192,5"
  [40]=>
  string(10) "haval224,5"
  [41]=>
  string(10) "haval256,5"
}

【PHP】プロセスをバックグラウンド処理する。

よく使うので自分用メモ。

// 実行ファイル(.php)パス
$execFilePath = '/path/to/target.php';
// パラメーターを渡したい場合は以下の通り
$arg1 = 'param1';
$arg2 = 'param2';
$arg3 = 'param3';
$arg4 = 'param4';
$arg5 = 'param5';
// 実行コマンドを整形する(最後のアンパサンドは、処理をバックグラウンドで行うという意味)
$cmd = "nohup php -c '' '".$execFilePath."' '".$arg1."' '".$arg2."' '".$arg3."' '".$arg4."' '".$arg5."' > /dev/null &";
// バックグラウンド実行されたコマンドのプロセスIDを取得したい場合は、実行コマンドの末尾を以下のようにする
$cmd = "nohup php -c '' '".$execFilePath."' '".$arg1."' '".$arg2."' '".$arg3."' > /dev/null & echo $!";
// 実行する。
$output = array();
// $outputにバックグラウンドで実行中のプロセスIDが格納されている
exec($cmd, $output);

なぜ「echo $!」でプロセスIDが取得できるのかというと、Linuxがバックグラウンド処理中のPIDを変数$!に突っ込んでくれているからである。

 

【PHP】関数のエイリアスを把握する。

fwrite()関数とfprintf()関数の違いを調べていたらエイリアスという概念があることを知ったのでメモ。

エイリアスとは、複数の名前を持つけれども動作は同じ関数のことを言うらしい。

たとえばfputs()関数はfwrite()関数のエイリアスであり、使用されている拡張モジュールが同一なため、実行結果として同一の値を得ることができる。

よく使うところで例を挙げると、die()もexit()のエイリアス関数だったりする。

まとめると、互換性の観点で古い名前を残しているからどっち使っても良いけど、なるべく元の関数を使おうね!という話である。

その他の関数エイリアス一覧は以下URLを参照されたし。
http://php.net/manual/ja/aliases.php

 

【PHP】fprintf()、vfprintf()の違い。

前回の記事←に引き続き、printf()系の関数はこれで出尽くしたかな。

■fprintf()

フォーマットした文字列をファイルストリームに書き込む。
第一引数にファイルポインタを指定し、第二引数にフォーマット、それ以降に置換文字列を指定する。

■vfprintf()

フォーマットした文字列をファイルストリームに書き込む。
上記関数との違いは置換文字列を配列として受け取る点。(第三引数に配列で置換文字列を渡してあげればよい。)

 

にしても種類が多い。
printf(), sprintf(), vprintf(), vsprintf(), fprintf(), vfprintf()

細かいけど重要。