Невозможно записать в /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.
Ответы
Ответ 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
Я не уверен, что это проблема, с которой вы столкнулись, но я нашел ваш вопрос, ища это решение, поэтому, думаю, это может помочь кому-то другому.