Подтвердить что ты не робот

Невозможно записать в /tmp с php, несмотря на 777 разрешений и нет значения open_basedir

Я пытаюсь записать файл в мой каталог /tmp (на сервере apache) с помощью функции php fopen, но это не удается:

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

Это возвращает сообщение об ошибке:

не удалось открыть поток: нет такого файла или каталога.

Для каталога /tmp установлены права доступа drwxrwxrwt и я вижу, что веб-пользователь записывает в него другие файлы. Таинственным образом, если я указываю сценарий на другую папку с разрешениями 777, он возвращает успех. Но мой open_basedir не имеет значения. У меня есть safe_mode=on и allow_url_fopen=off, но я не думаю, что это должно объяснить?

Это PHP 5.3.10 на Apache Httpd 2.0.

4b9b3361

Ответ 1

У меня была точно такая же проблема. PHP не сообщал о проблемах с открытием файла в /tmp/myoutputfile, но по этому пути не было ни одного файла. Тогда я сделал

find / -name "myoutputfile"

и нашел его в /tmp/systemd-… /myoutputfile. Я нашел эту статью в Google.
Итак, в моем случае это была комбинация Systemd и Apache Httpd. Я надеюсь, что это кому-то поможет.

Ответ 2

В соответствии с отображаемым сообщением об ошибке нет папки /tmp/. Возможно, папка tmp находится где-то еще, чем корень?

Эта ошибка не будет отображаться, если файл фактически не существует, поскольку он попытается создать его.

Метод x также возвращает предупреждение, если файл уже существует. (doc: http://www.php.net/manual/en/function.fopen.php)

Я думаю, это также по другой причине, это может пойти не так, - пользователь, который выполняет PHP, не имеет прав на запись в папке /tmp/.

Ответ 3

Попробуйте добавить /tmp в open_basedir. Например:

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

Я не уверен, что это проблема, с которой вы столкнулись, но я нашел ваш вопрос, ища это решение, поэтому, думаю, это может помочь кому-то другому.