2008年12月25日

ディレクトリ系、ファイルアクセス系のphpコマンドが利かない

phpというよりサーバー(linux)の話題かもしれませんが、
プログラマオンリーの人は気付かない場合も多いので、
今回は、解決メモを・・・。

特定のphpコマンドがきかない。。。。
safe modeのせいと探ってみたが、
結局、別の設定で解決したという事があったので紹介します。

safe modeのせいで特定のphpコマンドが使えないという
ことがよくあるため、
そういった解決方法の回答を良く見かけます。
そのため、よけいにsafe modeのせいだと思ってしまうケースもあるようです。

きっとこのせいだと、試しに(あくまでも試しに)safe modeをOffにしてみます。
これで解決すれば、safe modeの問題です。

Web上でもsafe modeせいだとの回答で終わっている問答もみかけます。
その場合、わざわざsafe modeをOffにするのではなく、PHPのcgi版にして
対応できる場合もありそうです。


でも、safe modeをOffにしてもだめだったというケースもあります。

結局、phpでできないなら、シェルでやるぞとか、解決方法もすごい深いところに
たどり着きます。

safe modeをOffにしてもだめだったというケースの方のために
メモをのこしておきます。

その場合で、/httpdocs内とは別ディレクトリが関連している場合は、
次の可能性もあります。
私の場合、サーバー管理にPleskを使っていますがその場合に
限った事かもしれまんが、事例として参考にして下さい。

結論から先に言うと、vhost.confを作成し、
open_basedirを追記すればよいのですね。

サーバーにもよりますが、
メインドメインなら、
/var/www/vhosts/ドメイン名/conf/
サブドメインなら、
/var/www/vhosts/ドメイン名/subdomains/サブドメイン名/conf/
という感じでconfディレクトリを探します。

そこに、httpd.include
という設定ファイルがすでにセットされているのですが、
httpd.includeは自動的につくるサーバーのconfigで、
open_basedirの設定が/httpdocsオンリーになっています
(正確にはそうではないのですが、説明の都合上そういうことに
しておきます)。
そうすると、いわば、「phpファイルは/httpdocsに置きなさい」ということになっているわけです。
そこが諸悪の根源(でもないか)です。
でも、/httpdocsと別ディレクトリにわざわざphpを置いているのは
それ相応の理由があります。
主に直打ちでアクセスできるところにこのファイルたちはおきたくないという
セキュリティ上の理由が多いと思います。

あるいは/httpdocsと別ディレクトリにphpがなくても、
phpで、別ディレクトリへ
参照したり、書き込みに行ったり、ファイルやディレクトリ作成したりといった
ケースがあります。

私の場合、後者でした。
そうしたコマンド(ディレクトリ系、ファイルアクセス系)などは、
やはりsafe modeと絡んでる場合もあるので、そっちのほうだと
思いがちになってしまします。
しかしさきほど説明したようにsafe modeをOffにしてもだめでしたが
結局、ディレクトリ階層の問題でした。
そこで、open_basedirにパスを追加すると解決します。

httpd.includeにパスを追加するとよさそうにみえますが
このファイルは、再起動やPleskで設定をするたびにデフォルトに
戻ってしまいますので使いません。

そのかわりに、同じconfディレクトリにvhost.confを作成し、
open_basedirを上書きすればよいという話にたどり着きます。

vhost.confはたとえば次のようにします(サブドメインなら変わります)
(httpdocsと同列階層に「logdir」というphp用のディレクトリがある想定です)


<Directory /var/www/vhosts/ドメイン名/httpdocs>
php_admin_value open_basedir "/var/www/vhosts/ドメ
イン名/httpdocs:/var/www/vhosts/ドメイン名/logdir"
</Directory>


コロン区切りで追加します。

まぁ標準ということで/tmpも入れといたほうがよいかもしれません。

あとはコマンドプロンプトより
/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=ドメイン名
を実行します。
これで万事うまく行きました。

場合によってはphpinfoやphp.iniもチェックしてみてください。

深いディレクトリへのphp操作が利かず困っていた方も
チェックしてみる価値はあるかもです。

posted by TeeMa at 01:39| Comment(0) | php | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: