Кажется, не удается получить правильные разрешения для mkdir () в PHP

У меня есть следующий простой скрипт для тестирования функции mkdir () в PHP:

<?php
  $id = rand();

  $targetPath = $_SERVER['DOCUMENT_ROOT'] . '/sample_folder/' . $id .'/';
  mkdir(str_replace('//','/',$targetPath), 0755, true);
?>

В идеале это создавало бы случайную папку каждый раз, когда скрипт запускается в моем веб-каталоге / sample_folder. Sample_folder имеет 755 разрешений.

Проблема, с которой я сталкиваюсь, заключается в том, что я продолжаю сталкиваться с проблемами PHP: mkdir () Permission denied issues. Мои права доступа sample_folder в настоящее время установлены на chmod 755.

ВСЕ Я прочитал, что не следует изменять chmod на 777, поэтому, пожалуйста, не предлагайте этого.

В целях тестирования chmod 777 в каталоге 'sample_folder' решает проблему, но опять же это создает проблемы с безопасностью. Есть ли что-то еще, что мне не хватает, как заставить эту работу работать?

Обратите внимание: мои пользователи PHP в системе - «apache»;

Для справки я использую PHP 5.3. * И CentOS 5.5 на выделенном виртуальном сервере Media Temple. Я также просмотрел почти все вопросы chmod по SO и, похоже, не могу найти решение, соответствующее моей проблеме (за исключением 777 предложений).

редактировать

Запуск ls -la на моем сервере возвращает:

drwxr-xr-x 2 ftphiddenname psacln 4096 26 января, 11:24 sample_folder

окончательное обновление

Предоставленные ответы были очень полезны. Для тех, кто ищет дополнительную информацию, я наткнулся на эту статью базы знаний, и, хотя она указана в Media Temple, я считаю, что принципы применимы к любым наиболее похожим конфигурациям:

(dv): устранение ошибок разрешений Apache


person JM4    schedule 26.01.2012    source источник
comment
Вместо chmoding вам нужно chown, чтобы убедиться, что 755 подходит для изменения каталога обсуждаемый. Для этого вам понадобится 7 (6?) В родительском каталоге - поэтому, если родительский каталог не принадлежит пользователю, от имени которого выполняется PHP, он не позволит вам сделать это с помощью 755.   -  person DaveRandom    schedule 26.01.2012
comment
@DaveRandom - спасибо за замечание. Честно говоря, я довольно хорошо разбираюсь в php, но иногда возникают проблемы с перемещением по Linux-серверу. Есть ли специальная команда для поиска этой информации и адреса в случае необходимости? Кстати, мой пользователь php - это apache.   -  person JM4    schedule 26.01.2012
comment
Если вы ls -l в родительском каталоге родительского каталога, вы можете увидеть разрешения и права собственности на родительский каталог (если вы последуете этому, я бы простил вас, если вы этого не сделали). По сути, в вашем примере вы должны ls -l корень документа, вы увидите нужную информацию. На самом деле все, что вам нужно сделать (как пользователю, имеющему на это разрешение), - это chown apache <document root>/sample_folder   -  person DaveRandom    schedule 26.01.2012
comment
@DaveRandom - большое спасибо. Команда chown в папке сделала именно то, что нужно. Я опубликую ссылку на конкретную статью базы знаний, которую я только что нашел, но есть ли способы предотвратить это в будущем или всегда нужно исправлять в разовых ситуациях?   -  person JM4    schedule 26.01.2012
comment
Папке будет назначен владелец создавшего пользователя - глядя на вывод, который вы разместили выше, я предполагаю, что вы создали его через FTP, и каждый раз, когда вы это делаете, у вас будет эта проблема. Чтобы этого избежать, вам нужно создать каталоги как apache пользователь (все, что вы создаете с помощью PHP, должно делать это), или chown их в apache, когда вы их создаете.   -  person DaveRandom    schedule 26.01.2012


Ответы (2)


Причина в том, что скрипту необходимы права на запись в sample_folder.

Я не знаю ваших фактических настроек, но я предполагаю, что ваш скрипт либо работает с разрешениями мира, либо с разрешениями группы, равными 5 (читать 4 + выполнить 1), поскольку ваши текущие разрешения - 755 (7 для владельца, 5 для группы и 5 для мира). Для записи каталогов в эту папку вашему сценарию потребуется доступ для записи. Вы можете установить это более безопасно, чем 777, если у вас есть доступ к каталогам chown. Я бы посоветовал создать группу под названием «веб-группа» или аналогичную и поместить в эту группу пользователя вашего веб-сервера. Затем предоставьте группе права на запись (770), которые будут уместны, когда вы это настроите. Если вы немного не уверены в том, как работают разрешения, окончательная настройка будет следующей:

sample_folder: принадлежит root, group webgroup, 770 разрешений добавить любой пользовательский apache (или другой веб-сервер), запущенный как веб-группа

РЕДАКТИРОВАТЬ:

Поскольку более подробная информация доступна в первоначальном сообщении, это означает, что вы добавляете пользователя apache в веб-группу. Если вам кажется, что это слишком сложная настройка или у вас нет полных разрешений на сервере для ее настройки, тогда также будет работать использование chown, как предлагалось в другом месте, чтобы позволить apache владеть каталогом.

Например: chown apache sample_folder

Это сделает apache владельцем папки, предоставив ему доступ к разрешениям на запись (при условии, что это все еще 755).

person majic bunnie    schedule 26.01.2012
comment
примечательно, что в настоящее время sample_folder имеет 755 разрешений. - person JM4; 26.01.2012
comment
В самом деле, это, вероятно, причина, по которой ваш скрипт не может писать, он, вероятно, работает с мировыми разрешениями 5, что дает только разрешения на чтение и выполнение. - person majic bunnie; 26.01.2012

Вы проверили разрешения файловой системы для папки, в которой вы пытаетесь создать каталог?

Вам следует cd зайти в каталог и ls -la, чтобы увидеть текущие права собственности и права файловой системы:

paulbain@test ~/test $ ls -la
total 8
drwxr-xr-x  2 paulbain apache 4096 Jan 26 17:38 .

В моем примере выше это владелец Read Write Execute, Group Read and Execute и Every Read and Execute.

Если бы это было так и ваш Apache запущен под пользователем из группы apache, PHP не смог бы создать каталог.

person Paul Bain    schedule 26.01.2012