PHPで指定するディレクトリが書き込めるかチェックをして書き込めない場合は

そのディレクトリのパーミッションを変更(777など)したいと思います。

ディレクトリの書き込みチェックは
$dir="test";
if(!is_writable($dir)){
chmod($dir,0777);
}

としているのですが、さくらのサーバなど777だと駄目な場合があります。(サーバエラーになる)
777が駄目で705だとOKとか、PHP側で自動的に判別する方法はあるのでしょうか?
いちいちサーバに合わせて手動でパーミッション設定するのは面倒なので
何か方法があれば教えて下さい。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/07 13:31:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:sasaki30234 No.1

回答回数18ベストアンサー獲得回数0

ポイント60pt

PHPの話と言うよりはUNIX/Linuxの設定の問題ですね。

777でなくても705で良いのなら、最低限の権限のみを許すようにするのが適切です。最低限のパーミッションが設定できないのなら、ソフトの仕様を変えるか、サーバ運営会社に相談すべきです。

したがって、「サーバーによってパーミッションを自動的に設定する」という考え方ではなく、「最低限のパーミッションを決め、そのパーミッションがうまく動くように環境を整える」という考え方が適切ではないかと思います。

上記は情報が少ない中での一般論で本件に当てはまるかどうか分かりませんが、まずこのあたりから検討されてはいかがでしょうか?

id:kt26

私の解釈では「最低限=どの環境でも一応動く」と認識しているのですが、ディレクトリ内でのデータ書き換えなど、書き込み権さえあれば書き込める(と思う)ので、必ずしも777である必要はないかと思います。

サーバ毎に運営会社を調べて仕様を変えるのは効率的では無いと感じて質問した次第ですが、皆さんのコメントから「環境依存する」と言う事もわかりましたので、そう納得したいと思います。

2010/02/02 08:58:14
  • id:Reiaru
    さくらは 777 での実行を許可していません。
    実行する場合には 705 もしくは 755 でしか行えません。

    面倒なので調べませんが、レンタルサーバー利用におけるヘルプか何かのどこかにそう書いてありますよ。
  • id:kt26
    それを検証した上での質問です。
  • id:b-wind
    基本的には mod_php か suPHP か CGI モードかによってほぼ決まる。
    ただ、絶対ではないしレンタルサーバー次第としか言いようがないかもね。
  • id:Reiaru
    なるほど、属性を変更しようとしてエラーが発生した際にそれをトラップしたいという事ですね。
    これは失礼を致しました。
  • id:km1967
    自分勝手に妄想を膨らませている人が一人いますね・・・
  • id:kt26
    b-windさん

    つまり「自分で調べる方法以外無い」という結論になるんですかね?
    それならそうで良いのですが、何かできそうな気もして質問しましたので、
    もう少し様子を見ます。
  • id:kn1967
    >いちいちサーバに合わせて手動でパーミッション設定するのは面倒

    トライアンドエラーで探るとか、アップロードされたファイルに、
    自動的に割り当てられているパーミッションから類推するとか、
    手はないではないけど、完璧とは言えず、面倒でも、適宜あわせていくしかないね。
    (セキュリティ関連の問題でもあるから、突破しようとするとそれなりに手間。)

    「全部とは言わないけど、ある程度までは自動対応するようにしたい」などと、
    言い出しそうだけど、ちょっとでも対応させようとしたら、欲が強くなっていって、
    自制できなくなって結局、中途半端になると思う。

    対応例としては、ありきたりだから知っているかもしれないけど、
    (a)柔軟な対応が可能な例
      どこか一箇所を書き換えれば済む様に、スクリプトを組み立てる
    (b)動作コストなどシビアな対応が求められる場合の例
      全スクリプトの 0777 の部分を __pm__ などとでも書いておいて、
      アップロード後に、一気に書き換え。
    など、用途や規模に応じて対応したらいいと思う。

    使い捨てのような小さなスクリプトなら、そこまで考える必要がそもそも無いのだし、
    汎用的あるいは複雑な構成のスクリプトを組むなら(a)(b)のような事を、
    設計段階からしっかり考えておいたほうがいいと思うよ。
  • id:kt26
    kn1967さん

    アドバイスありがとうございます。a・b参考になります。
    bの「全スクリプトの 0777 の部分を __pm__ などとでも書いておいて、アップロード後に、一気に書き換え。」

    と言うのがPHPの利用方法として全く想像が付かないのですが、configファイルか何かで定数指定してパーミッションの数値を変える?のだと思います。(或いは、初期設定の際のディレクトリ作成時とか)

    ぜひ参考にさせていただきます。
  • id:kn1967
    >configファイルか何かで定数指定

    それは(a)のほうに含まれる方法ですね。
    (b)のほうをもう少しだけ具体的に書くと・・・

    仮にA社では 0777 だとします。

    (事前準備)セットアップスクリプトの作成
    0xxx という引数が与えれば、ファイルを読み込んで、その中に含まれる、
    __pm__ という文字列を 0xxx に書き換えてくれるスクリプトを作る。
    このスクリプトはphpであっても良いし、perlなど違う言語でもかまわない。

    (手順1)アップロード
    __pm__ と書かれた状態のphpスクリプトをサーバにアップロード。

    (手順2)セットアップ
    セットアップスクリプトに 0777 という引数を与えて起動すれば、
    __pm__ は 0777 に書き換わり、正常に動くようになる。

    アップロード後にセットアップスクリプトを起動させるタイプのものは、
    おおよそ似たような事をしている。

    上記のさらに次のレベルとして、
    アップロードするファイルはZIP圧縮したものなどを用いる。
    phpであれ何であれZIPファイルを解凍して、__pm__ を 0705 に書き換えの後、
    xxx.phpとして保存という事を行わせればパッケージとして使いやすいものと、
    なるやもしれません。

    解凍 もとい 回答拒否されてるのに、何やってるんだか・・・。
    せめて、この質問にたどり着いた人の役に立てばいいんだが・・・。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません