2012-05-25 5 views
13

php fopen関数を使用して/ tmpディレクトリ(Apacheサーバ上)にファイルを書き込もうとしていますが、失敗します。777のアクセス権とopen_basedir値なしでも/ tmpにphpで書き込むことはできません

<?php 
$handle = fopen("/tmp/test.txt", "x"); 
if ($handle) echo "Success!"; 
else print_r(error_get_last()); 
?> 

これは、「ストリームを開くことに失敗しました:そのようなファイルまたはディレクトリはありません」というエラーメッセージを返します。/tmpディレクトリの権限はdrwxrwxrwtに設定されており、Webユーザーが他のファイルを書き込んでいることがわかります。不思議なことに、私がスクリプトをパーミッション777の別のフォルダに向けると、スクリプトは成功を返します。しかし、私のopen_basedirは「価値がない」。私はsafe_mode = onとallow_url_fopen = offを持っていますが、それを説明する必要はないと思いますか?

これはapache 2.0のphp 5.3.10です。

+2

'test.txt'はありますか? – maialithar

+0

いいえ、上記のスクリプトのポイントは、私の/ tmpフォルダにファイルを作成できるかどうかをテストすることです。私は 'x'と 'w'フラグの両方でスクリプトを試しました。 –

+1

おそらくchrooted? – Robus

答えて

0

表示されるエラーメッセージによれば、フォルダ/tmp/はありません。おそらく、tmpフォルダはルート以外のどこかにありますか?

ファイルが実際に存在しない場合、このエラーは表示されません。ファイルを作成しようとすると、このエラーは表示されません。

方法xは、ファイルがすでに存在する場合にも警告を返します。 (doc:http://www.php.net/manual/en/function.fopen.php

これは、これが間違っている可能性がある別の理由として、PHPを実行するユーザーが/tmp/フォルダに書き込む権限を持っていないと思います。

+0

私が質問に書いたように、私のサーバーに/ tmpというフォルダがあります。それはルートにあります。また、phpを実行するユーザーには/ tmpフォルダにファイルを書き込んでいます。 –

0

/tmpopen_basedirを追加してください。たとえば:

php_admin_value open_basedir /some/path:/another/path:/tmp 

私は、これはあなたが実際に直面している問題でわからないんだけど、この解決策を探している間、私はそれが他の誰かを助けるかもしれないと思うので、私はあなたの質問を見つけました。

17

私はまったく同じ問題を抱えています。 PHPは/tmp/myoutputfileにファイルをオープンしても問題はないと報告しましたが、そのパスにファイルはありません。それから私はfind/-name "myoutputfile"をして、それを/tmp/systemd-.../myoutputfileに見つけました。 Googleはhttp://blog.oddbit.com/2012/11/05/fedora-private-tmp/を見つけました。だから私の状況では、システム+ apacheの組み合わせです。これが誰かに役立つことを願っています。

+1

私はCentOSを使い、 '/ tmp'にファイルを書き込んでスクリプトをテストしていました。コマンドラインから '/ tmp'をブラウズしていて、見つけられませんでした。彼らは 'systemd-private ...'フォルダに入っていました! –

+2

なぜこのような振る舞いですか? –

+0

この「プライベートフォルダ」の全パスをPHPから取得する方法はありますか? (私は "/tmp/systemd-private-b6fcf4393484blahblah87c822516fdfb-plesk-php70-fpm.service-OWpvrW/"を得ることを意味します) – OMA

関連する問題