Назад | Перейти на главную страницу

PHP fopen всегда терпит неудачу с отказом в разрешении

Я занимаюсь переносом пары блогов Wordpress на AWS и столкнулся с проблемой с правами доступа к файлам, которая помешала мне в последние пару часов.

Простейший возможный вызов fopen всегда завершается ошибкой «не удалось открыть поток: в доступе отказано»:

<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>

Я пробовал / проверял следующее

Что я упустил, что могло вызвать это? Я подозреваю, что смотрю на это так долго, что упускаю что-то очевидное.

Обновить: После применения предложения Уомбла Я начинаю думать, что эта проблема более гнусная, чем просто плохие разрешения или неправильная конфигурация PHP. Мне удалось получить приведенный выше код для записи файла, однако, несмотря на то, что сценарий PHP выполнялся с правильным пользователем и группировкой, владельцы и группа результирующих файлов были установлены на apache. Если я выполню тот же тестовый сценарий из командной строки, у выпущенного файла будут правильные разрешения. Это заставляет меня думать, что это проблема с использованием mod_suexec.

Редактировать: Мое использование getmyuid () и getmygid () неверны, поскольку они возвращают только пользователя и группу файла сценария, а не разрешения, с которыми он работает. Более правильный подход - использовать что-то вроде этого:

<?php echo exec('ps -up '.getmypid()); ?>

Хороший вопрос - показывает, что вы сделали домашнее задание.

Я не могу придумать ничего «очевидного», что вы не смогли бы проверить, поэтому могу дать вам только более сложные советы по отладке.

  • Зажечь strace о процессе PHP и посмотрите, что именно он делает под капотом.
  • Напишите немного кода, который fopen(..., 'r') чтобы трижды проверить, что у вашего дерева каталогов на самом деле все в порядке.
  • su соответствующему пользователю и попробуйте сделать что-нибудь в командной строке. Если это сработает, тогда вы знать ваш сценарий не работает с разрешениями, которые вы думаете.
  • Убедитесь, что нет расширенных списков ACL для компонентов файла, каталога или ведущего пути (getfacl инструмент для использования). Это необычно, но время от времени они подпрыгивают и отрывают вам лицо. Если у вас есть ACL, используйте setfacl -x чтобы избавиться от них, как только вы убедитесь, что они не нужны.

Проверьте, что это за домашняя папка apache (обычно это /var/www) и поместите файлы в эту папку, а затем дайте необходимые разрешения. Измените папку загрузки php temp на это. Это работает для меня.

пытаться /usr/sbin/apachectl -t -D DUMP_MODULES

проверьте, что все модули включены

Если вы получите

Warning: SuexecUserGroup directive requires SUEXEC wrapper.

разрешение

Такое предупреждение обычно вызвано недопустимыми разрешениями на оболочку suexec, оно должно быть:

# ls -la /usr/sbin/suexec
-rwsr-xr-x 1 root root 12064 2008-04-17 01:15 /usr/sbin/suexec

Если разрешения или права собственности отличаются от приведенного выше примера, используйте следующие команды, чтобы исправить их:

# chown root:root  /usr/sbin/suexec
# chmod 4755 /usr/sbin/suexec

после этого исправления все было в порядке.

2 вещи.

  1. Вам нужно избегать апострофа в своем заявлении на смерть.
  2. 5 - это r-x, 6 - rw-. Я бы установил ваши разрешения на 0766 для -rwxrw-rw-