Рекурсивный Chmod не работает PHP

У меня есть приведенная ниже функция PHP, которая должна рекурсивно изменять один из каталогов на моем сервере.

По какой-то причине это не работает - я знаю, что путь к каталогу правильный, так как я проверил его с помощью быстрого скрипта, который просто распечатывает файлы в этом каталоге.

$root_tmp = '/tmp/mixtape2'; 
chmod_r($root_tmp);

function chmod_r($Path) {
$dp = opendir($Path);
while($File = readdir($dp)) {
  if($File != "." AND $File != "..") {
     if(is_dir($File)){
        chmod($File, 0777);
        chmod_r($Path."/".$File);
     }else{
         chmod($Path."/".$File, 0777);
     }
  }
closedir($dp);
}

Любые идеи?


person Barry Jarvis    schedule 25.04.2013    source источник
comment
Просто мысль ... Имеет ли значение, что каталог, с которым я имею дело, является каталогом / tmp сервера? Итак, мне интересно, если это проблема разрешения? Например, если бы я был у терминала, должен ли я был бы sudo? если да, то как мне это сделать из php-скрипта?   -  person Barry Jarvis    schedule 25.04.2013
comment
Хорошо, я только что проверил, и владельцем файла, который выполняет этот скрипт, является «nginx», а пользователем файлов/папок, которые я пытаюсь выполнить chmod, является «root». Я думаю, мне нужно как-то изменить пользователя? К сожалению, это все новое для меня, поэтому я понятия не имею, куда идти дальше.   -  person Barry Jarvis    schedule 25.04.2013


Ответы (2)


chmod($Path.'/'.$File, 0777);

Вы должны указать полный путь к chmod

person Andrej Bestuzhev    schedule 25.04.2013
comment
Спасибо за быстрый ответ... Итак, на данный момент я передаю ему каталог из $root_tmp, который относится к тому, откуда запускается функция. Я изменил это на $root_tmp = '/tmp/mixtape2, и это все еще не работает. Имеет ли значение, что внутри каталога mixtape2 есть подпапки? - person Barry Jarvis; 25.04.2013
comment
Что значит "не работает"? Это не установка chmod или что-то в этом роде? использовать var_dump(chmod(..)); Кроме того, из документации: когда безопасный режим включен, PHP проверяет, имеют ли файлы или каталоги, с которыми вы собираетесь работать, тот же UID (владелец), что и исполняемый скрипт. Кроме того, вы не можете установить SUID, SGID и липкие биты. - person Andrej Bestuzhev; 25.04.2013
comment
да, это не установка chmod. Если я добавлю var_dump, то это даст мне 'bool (false) ‹путь/имя_файла›'. Я думаю, что это может быть проблема с правами пользователя, согласно моему комментарию к моему исходному вопросу. - person Barry Jarvis; 25.04.2013

Ваш PHP-скрипт выполняется веб-сервером, у которого, скорее всего, есть собственный пользователь в вашей системе. Поскольку файлы, которые вы пытаетесь выполнить с помощью chmod(), принадлежат пользователю root, у вас нет прав на их выполнение с помощью chmod. Сначала вам нужно зайти в свою файловую систему и передать эти файлы правильному пользователю и группе.

person Borniet    schedule 25.04.2013
comment
Спасибо за ответ... я только что искал в Google и наткнулся на функцию chown. Я попробовал стандартный chown($root_tmp, 'nginx');, который в моей голове должен изменить пользователя на пользователя исполняемого файла, упомянутого ранее. Однако это не сработало. Затем я также попробовал exec('chown nginx /tmp/mixtape2');, который также не сработал. Я предполагаю, что это снова из-за того, что я запускаю эти сценарии от пользователя веб-сервера. Любые указатели на то, куда идти отсюда? - person Barry Jarvis; 25.04.2013
comment
Вам нужно фактически войти на сервер и изменить эти файлы с помощью файлового менеджера или с помощью командной строки. chown -R nginx:nginx FILENAME должен помочь. - person Borniet; 25.04.2013
comment
Проблема в том, что это каталог tmp, в котором файлы создаются каждый раз, когда мы запускаем определенную функцию на нашем сайте. Выполнение этого через командную строку приведет только к chown файлам, которые есть прямо сейчас ... любые новые файлы, которые будут созданы, будут снова созданы «root», не так ли? Вот почему я искал решение для PHP, так как собирался встроить функцию, которая chown, chmod и затем разъединяет файлы. - person Barry Jarvis; 25.04.2013
comment
Правильно ... вы пробовали выполнить «sudo chmod»? Вы можете отредактировать файл /etc/sudoers, чтобы предоставить пользователю веб-сервера права sudo без пароля. Однако, это опасный путь, чтобы идти вниз, конечно... - person Borniet; 25.04.2013
comment
Я думал о предоставлении доступа к sudo, но, как вы сказали, это не лучший вариант ... возможно, мне было бы лучше посмотреть на cronjob для этой задачи? - person Barry Jarvis; 25.04.2013
comment
Если у вас есть возможность сделать это, я бы действительно выбрал работу cron. Chowning не является ресурсоемкой задачей, поэтому вы сможете запускать ее довольно часто, не забивая систему. - person Borniet; 25.04.2013