PHP でファイル・ディレクトリ作成する際に、気をつけておかないと大変なことになるちょっとした注意事項を書き記しておく。
個人的に陥った状況としては、WordPress プラグインを書いていて、一時ファイル作成用のディレクトリを消してあるつもりが消されていないということがあった。これは、放置してると、無限にディレクトリを作り続けるような設計になっていた為、早めに気がついて良かった。これに気がつくことができたのは、、PHP のエラーログを日毎に所定の位置にコピーしていくようなスクリプトを Cron で走らせていた為だ。
unlink() はディレクトリに適用されない
正直、は?という仕様なんだけど、unlink() はファイルのみ扱う。ディレクトリを渡すと、unlink(/tmp//directory): Operation not permitted in ...php on line ... といったエラーがでる。
これを知らないと大変。やばし。共用サーバーなどで使うと、大量にディレクトリが残るハメになる。
rmdir() は中にファイルやディレクトリが入っていると消してくれない
これも、は?案件。なんでリカーシブオプションがないの。なので自分で関数を書く必要がある。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function removeDirectoryRecursive( $sDirectoryPath ) { if ( ! is_dir( $sDirectoryPath ) ) { return; } $_aItems = scandir( $sDirectoryPath ); foreach( $_aItems as $_sItem ) { if ( $_sItem !== "." && $_sItem !== ".." ) { if (is_dir($sDirectoryPath . "/" . $_sItem ) ) { removeDirectoryRecursive($sDirectoryPath . "/" . $_sItem ); continue; } unlink($sDirectoryPath . "/" . $_sItem ); } } rmdir( $sDirectoryPath ); } |
sys_get_temp_dir() は最後にスラッシュを加えたり加えなかったり
一時ファイルの置き場所を決めるのに sys_get_temp_dir() を使っている場合、Windows 環境では最後にスラッシュはつかない。しかし、さくらレンタルサーバの FreeBSD では /tmp/ という値を返し、スラッシュが付く。
これを知らず、sys_get_temp_dir() . '/directory' などとしていると、/tmp//directory とスラッシュが重なる。幸い ulink(), rmdir(), file_exists() 等に関してはダブルスラッシュもシングルスラッシュとみなしてくれるようで、副作用はなかったが、これは相関パスを計算させるカスタム関数などで使うとバグの基になる。なので、この関数を使うときは常に rtrim( sys_get_temp_dir(), '/' ) としてあげるのが良さそうだ。
随時更新予定
まだまだ、あった気がする。思い出したら書き足す予定。
