web-dev-qa-db-ja.com

777のパーミッションとopen_basedir値がないにもかかわらず、phpで/ tmpに書き込むことができません

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の組み合わせでした。これが誰かに役立つことを願っています。

44

問題は、systemdとApacheの組み合わせが原因である可能性があります。これはPrivateTmpと呼ばれるセキュリティ機能であり、明らかにオプトアウトです。

不要な場合は、次のように無効にできます。

  1. /etc/systemd/system/multi-user.target.wants/Apache2.serviceのそれぞれのスイッ​​チをアウトコメントします:#PrivateTmp=true
  2. Systemdを再起動します:Sudo systemctl daemon-reload
  3. Apacheを再起動します:Sudo systemctl restart Apache2
1
untill

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

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

メソッドxは、ファイルがすでに存在する場合にも警告を返します。 (ドキュメント: http://www.php.net/manual/en/function.fopen.php

これは、これがうまくいかない可能性がある別の理由でもあると思います。PHPを実行するユーザーには、/tmp/フォルダーに書き込む権限がありません。

0
Rene Pot

/tmpopen_basedirに追加してみてください。例えば:

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

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

0
philippe_b