Chmod или как в PHP сменить права у файла? (рабочий вариант)

Как известно в php, есть большая проблема с установкой прав на файлы. Если вы наивно полагаете, что встроенная команда php chmod работает корректно, то далеко заблуждаетесь. На 99% процентах хостингах эта команда не работает. И в целом правильно. Безопасность прежде всего. Единственно, где работает стандартный метод, дык это где на файлах уже стоят права chmod 777. Дык тут и ежу понятно, что с этим файлом можно делать все что угодно. А вы попробуйте при помощи этой команды изменить права на файле chmod правами 755, допустим на одном из самых известных хостеров masterhost. Правильно, получите большую фигу. Так вот ковыряясь со всем этим барахлом, мне потребовалось сделать действительно РАБОЧУЮ функцию chmod, которой было бы глубоко наплевать какие права в данный момент стоят на файле.

Ковыряясь опять в первоисточнике http://ru2.php.net/chmod убедился в том, что действительно это функция проблемная. Но нашел там же хороший вариант решения проблемы через ftp.

Единственный недостаток этого варианта, это то, что на самом сервере вам придется хранить реквизиты для коннекта к ftp. Но если есть ум, то скрыть эти данные не составляет труда.

Предположим, где то у нас прошито:
define('ftp_server','ftp.site.ru');// сервер для коннекта ftp
define('ftp_path','/public_html/');// путь к сайту по ftp
define('ftp_user','login');// пользователь для доступа ftp
define('ftp_password','password');// пароль для входа на ftp

Сама непосредственно функция смены прав, позволяющая очень гибко управлять файлами.
>function  sd_chmod($_o,$_file,$_mode)// смена  прав у файла 
// server - ftp сервер для коннекта
// login - имя пользователя для входа на ftp
// password - пароль для доступа
// path - путь к файлам
{ // лог в функция ведется по максимуму
  $;
  $;
  $($_o['ftp_server']);//  попытка соединиться сервер 
  >if ($handle)
  { $log..$_o['ftp_server'].' successfull'."\r\n";//  лог 
    // если логин и пароль на ftp подшли
    >if (ftp_login($handle,$_o['ftp_user'],$_o['ftp_password']))
    { $log.."\r\n";// лог 
      // если установился нужный каталог 
      >if (!(ftp_chdir($handle,$_o['ftp_path'])==))
      { $log..$_o['ftp_path']."\r\n";// лог 
        >if (!(ftp_chmod($handle,$_mode,$_file)==))// меняем нужные права доступа 
        { $log..$_mode.' to file '.$_file."\r\n";// лог 
        }
        >else// если  смена прав произошла с ошибкой
        { $log..$_mode.' to file '.$_file."\r\n";// лог 
        }
      }
      >else// если ошибка  при смене каталога
      { $log..$_o['ftp_path']."\r\n";// лог 
      }
    }
    >else// если логин  или пароль не подошли.
    { $log.."\r\n";// лог 
    }
    ftp_close($handle);// закрыть соединение
  }
  >else// если нет связи с сервером
  { $log..$_o['ftp_server'].' not found'."\r\n";// лог 
  }
  $r['error']=$error;// возвращаем код ошибки если таковой  имел место
  $r['log_']=$log;// лог выполнения команды
  >return $r;// возвращаем номер ошибки
}

Расширенная функция, которая делает удобным вызов предыдущей функции:
>function sd_cms_chmod($_file_name,$_code)
// пример вызова sd_cms_chmod('/images/catalog/groups_mini/000001.jpg',0755);
// $_file_name - файл, права которого требуется изменить
// $_code - код chmod прав. code должен передаваться без ковычек
{ // отделяем путь от файла, это требуется для корректности
  $('/',$_file_name);
  $>sizeof($rr);
  $;
  >if ($count>1)
  { $;
    >while ($it<$count)
    { >if (($it+1)==$count) { >break; }
      >if ($rr[$it]=) { $it++; >continue; }
      $fp..$rr[$it];
      $it++;
    }
    $fn=$rr[$count-1];
  }
  >else
  {  $fn=$_file_name;
  }
  // в итоге
  // $fp (file_path) - содержить путь
  // $fn (file_name) - содержит имя файла + расширение
  $>array();
  $o['ftp_server'];// адрес сервер, например  ftp.site.ru
  $o['ftp_user'];// пользовать
  $o['ftp_password'];//  пароль 
  // путь, например public_html + относительный путь, который  передан вместе с файлом
  $o['ftp_path'].$fp.'/';
  // избавляемся от ошибок в файловом пути.
  $o['ftp_path']('//','/',$o['ftp_path']);
  $($o,$fn,$_code);//  присваиваем пути 
  >return $r;
}

Сам вызовы функции происходит очень просто:
// устанавливаем соответствующие права
sd_cms_chmod('/images/catalog/images.jpg',0755); 

Незабывайте правильно прописать соответствующие define.

Желаю удачи

Наши контакты:

Телефоны
+7 (967) 555-3771

e-mail:
info@unibix.ru - для справок, заявок, заказов
ofis@unibix.ru - для документов и бухгалтерии
marketing@unibix.ru - отдел маркетинга, рекламы и партнерства
vk: vk.com/unibix
Время работы:
Пн—Пт, 10:00—19:00
Адрес офиса
236000, г. Калининград, ул. Гагарина, дом 16Г, офис №11,
ООО "Юнибикс" (950метров от Королевских ворот, ориентир магазин Виктория)