• ベストアンサー

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

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

  • PHP
  • 回答数2
  • ありがとう数0

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

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

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

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答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のままでいいと思いますけど。

関連するQ&A

  • ディレクトリーが作成されないのは何故でしょう?

    実は、下のように記述して実行してもディレクトリーが作成されずに、その原因がわからないでいます。 <?php parse_str($_COOKIE[abc]); $dirc=$ck_data1; print $dirc; if(!file_exists($dirc)){ mkdir("$dirc"); } ?> 一応ディレクトリー名を確認するために、途中でprint $dirc;を入れて ディレクトリー名を確認しましたが、問題ないようでした。 $dircという変数を遣わないで、直接ディレクトリー名を入れると 問題なくディレクトリーは作成されます。     ↓ <?php parse_str($_COOKIE[abc]); $dirc=$ck_data1; print $dirc; if(!file_exists("test")){  //←testというディレクトリー名を直接入れると、問題なくディレクトリーが作成される。 mkdir("test"); } ?> 何とか、ディレクトリ名を変数で受けて作成したいのですが、 なぜ、変数で受けることができないのかがわかりません。 どなたか、詳しい方よろしくご指導お願いいたします。

    • ベストアンサー
    • PHP
  • phpでディレクトリが作れません

    php初心者です レンタルサーバで php.iniはいじれない環境です、 ディレクトリを作ろうとすると Warning: mkdir(testdir) [function.mkdir]: File exists in /home/xxxx/public/www/php/mkdir.php on line 14 とエラーが出ます <? $chk = mkdir("mydir"); $chkr = mkdir("mydir_r", 0777); // 読み込みのみを許可 if ($chk) { echo "mydir を作成しました。 <br>\n"; } if ($chkr) { echo "mydir_r を作成しました。<br>\n"; } ?> 間違ってますでしょうか ご指導願いたいです

    • 締切済み
    • PHP
  • FTPでリモートサーバーのディレクトリーの存在確認をしたい。

    FTPでの転送プログラムを組んでいるところですが、FTPサーバーに既に存在するディレクトリー名と同じディレクトリー名で作成しようとすると、エラーになります。 それで、同じディレクトリーが存在するかどうかのチェックを行いたいのですが、下記のやり方では旨くチェックしてくれません。 既に存在するディレクトリーを存在しないと嘘を教えます。 以上宜しくお願い致します。 If IO.Directory.Exists(uri) = False Then MsgBox(uri & "が存在しません。") End if

  • web 上のファイルが存在するかチェックする方法

    php 5 を使用です。 自分のサーバーのファイルは file_exists($filename) でチェック出来ますが、 web 上のファイルが存在するか確認することは出来るのでしょうか? web 上のファイルというのは 自分のサーバーではないこういうものです。 http://www.example.com/images/pic01.jpg

    • ベストアンサー
    • PHP
  • 特定のディレクトリのPDOエラーについて

    お世話になります。 ある特定のディレクトリで走らせると「 Call to a member function execute() on a non-object 」エラーを吐かれます。 例えばドメイン直下にファイルをアップロードさせて実行すると正常に走りますが、 様々な処理をしているディレクトリの下で走らせるとエラーが出てしまいます。 明らかに「 様々な処理をしているディレクトリ 」にアップしてあるファイルと干渉しているように 思うのですが、原因が全く分かりません。 因みに、file_exists関数やdir系の関数も使用していません。 PDOを扱う上でディレクトリ間で干渉してしまう可能性がある書き方や関数等があるのでしょうか? エラーが吐かれる場所は、最終処理のユーザ定義関数の箇所です。 漠然とした質問で恐縮ですが、設置するディレクトリで正常に走る、走らないというのが 意味不明なので、ご教示いただけたら幸いです。 どうぞよろしくお願い申し上げます。 ---------------- ▼スペック PHP 5.3.3 MySQL 5.0.95 ----------------

    • ベストアンサー
    • PHP
  • ローカルホストでディレクトリ作成

    いつもお世話になっております。 現在、自宅でphpを使って開発をしています。 mkdirを使用してディレクトリを作成しようとしてるのですが、 サーバー上ではパーミッションの設定をその他に対して書き込み権限を与えればうまくいくのですが、 ローカルホスト上では「Permission denied 」エラーが出てうまく作成できません。 IIS6.0でどうやってパーミッションを操作するのかが分からず困っています。 どのようにすればローカル環境でディレクトリ作成できるかお教えください。 開発環境は以下の通りです。 言語:php5 WEBサーバ:IIS6.0 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • サーバー上にディレクトリを作成したいがパーミッションエラー…。

    フォームに入力した情報をもとに、 サーバー上にディレクトリを作成したいのですが、 Warning: mkdir(作成したいディレクトリ名): Permission denied in ~ というエラーが出てしまい、ディレクトリを作成できません;; 原因はなんなんでしょうか? どうぞよろしくお願いします。

    • 締切済み
    • PHP
  • C言語でのディレクトリ作成についての質問です。

    C言語でのディレクトリ作成についての質問です。 Linuxコマンドのmkdir -pコマンドのようなことをC言語で実現したいのですが、 mkdir(dir1/dir2)のようにすると、エラーになってしまいます。 mkdir(dir1)のように階層でないディレクトリを指定した場合はうまくいくのですが・・・ mkdir関数では階層ディレクトリを1度で作成できないのでしょうか。 ディレクトリをたどってmkdirを1回ずつ使用しなければいけないのか、 階層ディレクトリを指定できる関数がほかにあるのか、 ご教授お願いいたします。

  • 別ユーザ所有のディレクトリ内にファイル作成できない

    こんばんは。 タイトルのとおりですが、まずPHPでディレクトリを作成し、 その中にindex.htmlを作成しようとしているのですが上手くいきません。 PHPで作成したディレクトリの所有者はapacheになっているためかと思い、 実際にFTPを通して自分で作成したディレクトリの中にindex.htmlを作成したところ上手くいきました。 ディレクトリのパーミッションはいずれもスクリプトにより0777を指定しています。 このように、PHPのみでディレクトリを作成し、その中にファイルを作成する といったことが出来ずにいます。解決策等ございましたらお教えください。 参考までに、ソースを掲載しておきます。 これを設置するディレクトリのパーミッションは0777にしてみましたが、出力は「fopen error」になります。 <?php $path = "./dir/"; if(mkdir($path, 0, true)){ chmod($path, 0777); if($fp = fopen($path."index.html", "w")){ fputs($fp, $put); fclose($fp); print "Created!"; }else{ print "fopen error"; } }else{ print "mkdir error"; } ?>

    • ベストアンサー
    • PHP
  • 外部ディレクトリの存在確認と変更

    2点質問させて頂きます。 1つ目は、外部ディレクトリの存在を確認する方法はありますでしょうか? もしありましたら、教えて頂きたいと思います。 「外部ファイル」の場合は、fopenなどを使って 存在は確認できたのですが、「外部ディレクトリ」がいまいち分かりません。 file_existsやis_dirは、外部参照の時は使えませんでした。 2つ目は、また外部サーバー絡みなのですが 外部のディレクトリ名、またはファイル名を 変更する事は可能でしょうか? まだ試していませんが、FTP関数を使って出来るかもしれないのですが それ以外の方法で何かありましたら教えて頂けないでしょうか。 rename関数は使えませんでした。 宜しくお願い致します。

    • 締切済み
    • PHP

専門家に質問してみよう