Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Массовая смена прав доступа к директориям
 
 автор: Владимир55   (30.12.2008 в 10:40)   письмо автору
 
 

Перенося сайты на сервер, я встретился с такой проблемой: очень много папок (сотни папок с поддиректориями) должны иметь права доступа 777. Делать это вручную - долго и утомительно. Хотелось бы сделать служебный скриптик, который бы отыскал ВСЕ папки в корне сайта, и установил бы на них и на вложенные папки права доступа 777.

Как я полагаю, за основу можно было бы взять функцию удаления папок, имеющуюся на этом Форуме, и вместо удаления unlink сделать установление прав chmod($dire, 0777);

// Удаление директории
function DirDelete($dire)
{
    if(is_dir($dire))
    {
        $dir  = opendir($dire);
        while (false !== ($filename = readdir($dir)))
        {
            if($filename!='.' && $filename!='..')
            {
                if(is_file($dire."/".$filename))  unlink($dire."/".$filename);
                if(is_dir($dire."/".$filename))  DirDelete($dire."/".$filename);
            }
        }
        closedir($dir);
        rmdir($dire);
    }
    if(is_dir($dire)) echo "Произошли ошибки при удалении директории ".$dire."!";
}

DirDelete("kniga");  // Здесь имя удаляемой директории. Удаляется вместе с папками и файлами! 


Однако непонятно, как задать имя папки, если работа ведется начиная с корня сайта?

  Ответить  
 
 автор: Loki   (30.12.2008 в 11:13)   письмо автору
 
   для: Владимир55   (30.12.2008 в 10:40)
 


<?php
foreach (glob($_SERVER['DOCUMENT_ROOT']."*"GLOB_ONLYDIR) as $dir) {chmod($dir0777);}
?>

Но я бы предпочел по ssh

А... фразу про вложенные я проглядел. Тогда:
<?
function rglob($pattern='*'$flags 0$path='')
{
    
$paths=glob($path.'*'GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
    
$files=glob($path.$pattern$flags);
    foreach (
$paths as $path) { $files=array_merge($files,rglob($pattern$flags$path)); }
    return 
$files;
}
foreach (
rglob($_SERVER['DOCUMENT_ROOT']."*"GLOB_ONLYDIR) as $dir) {chmod($dir0777);}

  Ответить  
 
 автор: Trianon   (30.12.2008 в 11:15)   письмо автору
 
   для: Loki   (30.12.2008 в 11:13)
 

а оно пройдет, когда php подключен, как модуль apache?

  Ответить  
 
 автор: Loki   (30.12.2008 в 11:20)   письмо автору
 
   для: Trianon   (30.12.2008 в 11:15)
 

Зависит от того, как файлы попали на сервер. Если по фтп - скорее всего нет, а если были созданы скриптом, тогда - вполне.

  Ответить  
 
 автор: Владимир55   (30.12.2008 в 12:37)   письмо автору
 
   для: Loki   (30.12.2008 в 11:20)
 

А у меня как раз такая ситуация - php подключен, как модуль apache, и файлы закачены посредством фтп.

Как быть в этом слкчае?

=========
рнр можно и и переподключить на время специально для этой операции. Например сделать PHP как CGI или PHP как FastCGI (хотя я и не знаю, что это такое).

  Ответить  
 
 автор: Loki   (30.12.2008 в 13:16)   письмо автору
 
   для: Владимир55   (30.12.2008 в 12:37)
 

тогда через консоль

  Ответить  
 
 автор: Владимир55   (30.12.2008 в 13:33)   письмо автору
 
   для: Loki   (30.12.2008 в 13:16)
 

А если закачать архив, и затем его разъархивировать скриптом.

Это не поможет делу?

  Ответить  
 
 автор: Trianon   (30.12.2008 в 11:13)   письмо автору
 
   для: Владимир55   (30.12.2008 в 10:40)
 

вообще-то это одна команда chmod -R ...

  Ответить  
 
 автор: Владимир55   (30.12.2008 в 13:06)   письмо автору
 
   для: Trianon   (30.12.2008 в 11:13)
 

Оба foreach - инвалиды...

Что бы это значило?

  Ответить  
 
 автор: xx77   (30.12.2008 в 14:43)   письмо автору
 
   для: Владимир55   (30.12.2008 в 13:06)
 

.

  Ответить  
 
 автор: xx77   (30.12.2008 в 14:45)   письмо автору
 
   для: Владимир55   (30.12.2008 в 13:06)
 

Всмысле Warning: Invalid argument supplied for foreach() ?
значит первым параметром foreach оказался не массив, следовательно rglob() как и возможно glob() ничего не вернула.

Если потом в планах есть редактировать файлы вручную через FTP лучше ничего не делать функциями работающими через файловую систему,
или потом будет возможность что-то делать только скриптами (cms вобщем нужна потом).

// если не говорить о ssh
я так думаю

  Ответить  
 
 автор: Владимир55   (30.12.2008 в 16:41)   письмо автору
 
   для: xx77   (30.12.2008 в 14:45)
 

И всё же, как избавить от инвалидности и довести до рабочего состояния вот этот предложенный Loki код:

function rglob($pattern='*', $flags = 0, $path='') 

    $paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); 
    $files=glob($path.$pattern, $flags); 
    foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $flags, $path)); } 
    return $files; 

foreach (rglob($_SERVER['DOCUMENT_ROOT']."*", GLOB_ONLYDIR) as $dir) {chmod($dir, 0777);} 

  Ответить  
 
 автор: xx77   (30.12.2008 в 17:22)   письмо автору
 
   для: Владимир55   (30.12.2008 в 16:41)
 

сделайте другими функциями
<?php
$time
=0;
function 
g_t($bool=false){ //время
 
global $time;
 list(
$m$s) = sscanf(microtime(), '%f %u');
 if(
$boolprintf("%.7f", (($m += $s) - $time));
 else 
$time=$m $s;
}
set_time_limit(0);
ini_set('max_execution_time'0);

g_t();

function 
xxxxxx($dir) {
 
$dh opendir$dir );
 while(
$file readdir($dh)) {
    if (
is_dir($dir '/' $file) && $file{0} != '.') {

        echo 
$file ' - ';
        
//  if (chmod($dir . '/' . $file, 0777)) echo 'ok'; 
        
echo '<br>' ."\n"
      
xxxxxx($dir '/' $file);
    }
 }
}

xxxxxx('.');
g_t(1);
?>

  Ответить  
 
 автор: Владимир55   (30.12.2008 в 17:33)   письмо автору
 
   для: xx77   (30.12.2008 в 17:22)
 

В исходной формулировке вопроса самой последней строкой я привел выражение

DirDelete("kniga");  // Здесь имя удаляемой директории. Удаляется вместе с папками и файлами! 


определяющее директорию, с которой начинается обработка.

В моем случае - это корень сайта.

Не могли бы Вы подсказать, как пишется выражение
DirDelete("kniga");   
для корня сайта?

  Ответить  
 
 автор: xx77   (30.12.2008 в 17:53)   письмо автору
 
   для: Владимир55   (30.12.2008 в 17:33)
 

из любой дирректории такие функции будут работать если записать полный путь к корню
xxxxxx('/home/site/www');
Возможно и с относительными путями будет работать как xxxxxx('../../../www'); но я-бы так не делал

и ещё масса препятствий может получиться, таких как safe_mode , как выше говорилось является-ли владелец дирректорий тем-же пользователем от имени которого выполняются скрипты, и даже однажды столкнулся с тем что is_dir() не работала уровнями выше скрипта.

  Ответить  
 
 автор: GeorgeIV   (30.12.2008 в 17:43)   письмо автору
 
   для: Владимир55   (30.12.2008 в 10:40)
 

Перенося сайты на сервер, я встретился с такой проблемой: очень много папок (сотни
 папок с поддиректориями) должны иметь права доступа 777. Делать это вручную - долго и
 утомительно. Хотелось бы сделать служебный скриптик, который бы отыскал ВСЕ папки в
 корне сайта, и установил бы на них и на вложенные папки права доступа 777.

А с помощью какого нибудь клиента не проще? Я беру WinSCP и делаю все права на все вложенные папки и файлы нескольким щелчками мыши.

  Ответить  
 
 автор: Владимир55   (30.12.2008 в 18:23)   письмо автору
 
   для: GeorgeIV   (30.12.2008 в 17:43)
 

"и делаю все права на все вложенные папки и файлы нескольким щелчками мыши."

286 папок, в каждой из которых по 4-10 подддиректорий, в некоторых из которых есть еще по одной поддиректории... Вот и хотелось как по-проще - и на сейчас, и, главное, на будущее.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования