Phpfopen関数を使用して(Apacheサーバー上の)/ tmpディレクトリにファイルを書き込もうとしていますが、失敗します。
<?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 Httpd2.0ではPHP 5.3.10です。
私はまったく同じ問題を抱えていました。 PHP /tmp/myoutputfile
でファイルを開くことに問題はないと報告されましたが、そのパスにファイルはありませんでした。
find / -name "myoutputfile"
/tmp/systemd-…/myoutputfile
で見つけました。私はGoogleで この記事 を見つけました。
つまり、私の場合は、SystemdとApacheHttpdの組み合わせでした。これが誰かに役立つことを願っています。
問題は、systemdとApacheの組み合わせが原因である可能性があります。これはPrivateTmpと呼ばれるセキュリティ機能であり、明らかにオプトアウトです。
不要な場合は、次のように無効にできます。
/etc/systemd/system/multi-user.target.wants/Apache2.service
のそれぞれのスイッチをアウトコメントします:#PrivateTmp=true
Sudo systemctl daemon-reload
Sudo systemctl restart Apache2
表示されたエラーメッセージによると、フォルダ/tmp/
はありません。おそらく、tmpフォルダーはルート以外の場所にありますか?
このエラーは、ファイルを作成しようとするため、ファイルが実際に存在しない場合は表示されません。
メソッドx
は、ファイルがすでに存在する場合にも警告を返します。 (ドキュメント: http://www.php.net/manual/en/function.fopen.php )
これは、これがうまくいかない可能性がある別の理由でもあると思います。PHPを実行するユーザーには、/tmp/
フォルダーに書き込む権限がありません。
/tmp
をopen_basedir
に追加してみてください。例えば:
php_admin_value open_basedir /some/path:/another/path:/tmp
これがあなたが実際に直面した問題かどうかはわかりませんが、この解決策を探しているときにあなたの質問を見つけたので、それは他の誰かを助けるかもしれないと思います。