Я использую CentOS 7 и PHP 7.2.5. Я не могу получить move_uploaded_file (), file_put_contents () или exec ('cp /tmp/test.txt /var/www/html/test.txt', $ out); работать в любой папке кроме / tmp. / var / www / html принадлежит apache: apache, и только для разрешений 755. Я попробовал 777, но все равно получаю отказ в разрешении. Он застрял в папке systemd-private-123abc-httpd.service-11cba / tmp /, но я отключил PrivateTmp для httpd.
Загруженный файл загружен, и все в порядке, пока я не попытаюсь его переместить. Я могу переместить его под другое имя файла в каталоге / tmp, но я не могу переместить его в любой другой каталог.
Все это нормально работает:
file_put_contents('/tmp/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
exec('cp /tmp/test.txt /tmp/test2.txt', $out);
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/tmp/'.$file);
Все это выдает предупреждение: ***: не удалось открыть поток: отказано в разрешении
file_put_contents('/var/www/html/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/var/www/html/'.$file);
exec('cp /tmp/test.txt /var/www/html/test2.txt', $out);
И снова / var / www / html принадлежит apache: apache и имеет 755 разрешений. Я совершенно сбит с толку. Весь этот код нормально работал на старом сервере, но категорически отказывается работать на новом сервере. Я смотрел и смотрел, но если ответ есть, он заблокирован слишком большим количеством ответов о стандартных разрешениях для файлов / каталогов.
Команда exec ('cp / ... на самом деле не выдает предупреждений или ошибок. Она работает или не работает. Ее можно копировать в каталог / tmp, но больше нигде.
cOle2 - Да, вот в чем проблема. Подробности в ответе ниже.
Как упоминалось в комментарии выше, проблема была в SELinux. Я отключил его, и все заработало, как ожидалось. Я не хотел оставлять его выключенным, поэтому я попытался установить правила, которые разрешили бы то, что мне нужно, следуя эти направления. Это дало мне ошибки "semanage: error: unrecognized arguments: /var/www/html/test.txt"
Я запустил semanage fcontext -l> output.txt и проверил файл. Уже существовало правило (для WordPress и / или Drupal), разрешающее чтение / запись для любого каталога в / var / www / html с именем "uploads". /var/www/html(/.)? / uploads (/.)? все файлы system_u: object_r: httpd_sys_rw_content_t: s0
Итак, я переместил свой целевой каталог в каталог с «загрузками» в пути. mv -f / var / www / html / shared / pics / * / var / www / html / shared / uploads / pics
Я подключил все это к apache: apache и установил разрешения на 755, и он работал, как ожидалось. Итак, если SELinux вызывает у вас проблемы, и вы не можете заставить изменить правила, найдите правила и следуйте им.
Если проблема не исчезла, попробуйте отключить систему privateTmp.
Я попробовал решение "multi-user.target.wants", оно сработало, но после перезапуска, но в какой-то момент PrivateTmp вернется к истине. Как и в основном я использую Apache2 в PHP, я наконец отредактировал php.ini и раскомментировал строку sys_temp_dir.
По умолчанию система использует временный каталог, назначенный функцией sys_get_temp_dir. Функция sys_get_temp_dir вернет "/ tmp", но правда в том, что ваши файлы tmp хранятся по некоторому пути, например /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*. Итак, какая работа для меня была:
Отредактируйте php.ini (путь может меняться между версиями PHP)
sudo nano /etc/php/7.2/cli/php.ini
Затем раскомментируйте строку sys_temp_dir
; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"
Вы проверяли, включен ли SELinux?