• ベストアンサー

webサーバにディレクトリを作るときの有無チェック

phpのある関数内でwebサーバにディレクトリを作っています。 ここで作ろうとしているディレクトリが既にあるとエラーになるため、そのディレクトリがなければ作るようにしていますが、 ・目的のディレクトリと同名のファイルがない(作られない)ことが分かっている ・この関数が呼ばれる頻度が高い とき、下記のどっちの方法が良いのでしょうか? 1.そのディレクトリが無ければ作る if(!file_exists($newDir)) {  mkdir($newDir); } 2.エラーを無視する @mkdir($newDir);

質問者が選んだベストアンサー

  • ベストアンサー
noname#129900
noname#129900
回答No.1

・選択肢2を使う時といえば、何らかの作業で、即席コードを書く時くらい。 ・>この関数が呼ばれる頻度が高い この程度のコードなら一瞬で終わるだろうから、気にしなくて良い。 ・file_exists()がFALSEの時mkdir()をして、is_writeable()ではないですかね。 必要なら、TRUEの時もis_writeable()等を。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

発生するのがエラーなら難しい所です。実際には実行が中断するようなエラーでなく、warningのメッセージが出て関数がFALSEを返すだけですので、1 でいいです。 1 の方法だと、高トラフィックの時に同時に実行される複数プロセスでそのあたりの実行タイミングが重なると、 プロセス1のfile_exists()で存在しないことをチェックして、mkdirすることにするがその前に・・・・ プロセス2のfile_exists()でも存在しないことをチェック、こちらのプロセスでもmkdirすることに・・・・ プロセス1でmkdir()して成功 プロセス2でmkdir()して失敗(すでにあるので) プロセス3でfile_exist()で今度は存在するのでmkdirをスキップ ・・・・ のようなことが起こりえますので、警告メッセージを絶対に出ないようにすることは出来ません。mkdir()関数だと失敗しても処理が続行するのでこのままで良いでしょう。 2の方法のように @でメッセージを抑止するのは、もし Warning: mkdir(): File exists 以外の警告やエラーが発生しても抑止してしまうので、良くないです。 もし、高トラフィックでも絶対警告を出したくないということなら、 ini_set("track_errors",true); // メッセージが$php_errormsgに保存されるようにする $php_errormsg=""; @mkdir($newDir); //とりあえずメッセージを無視して ini_set("track_errors",false); if($php_errormsg!="mkdir(): File exists"){ // "すでにある" というメッセージでなければ throw new Exeption($php_errormsg); // 例外を投げる } とかですかね。@演算子を使う時はこうした方が良いでしょう。 普通は1のままでいいと思いますけど。