Следующая статья: Как лучше комментировать код на php?
Как известно в php, есть большая проблема с установкой прав на файлы. Если вы наивно полагаете, что встроенная команда php chmod работает корректно, то далеко заблуждаетесь. На 99% процентах хостингах эта команда не работает. И в целом правильно. Безопасность прежде всего. Единственно, где работает стандартный метод, дык это где на файлах уже стоят права chmod 777. Дык тут и ежу понятно, что с этим файлом можно делать все что угодно. А вы попробуйте при помощи этой команды изменить права на файле chmod правами 755, допустим на одном из самых известных хостеров masterhost. Правильно, получите большую фигу. Так вот ковыряясь со всем этим барахлом, мне потребовалось сделать действительно РАБОЧУЮ функцию chmod, которой было бы глубоко наплевать какие права в данный момент стоят на файле.
Ковыряясь опять в первоисточнике ru2.php.net/chmod убедился в том, что действительно это функция проблемная. Но нашел там же хороший вариант решения проблемы через ftp.
Единственный недостаток этого варианта, это то, что на самом сервере вам придется хранить реквизиты для коннекта к ftp. Но если есть ум, то скрыть эти данные не составляет труда.
Предположим, где то у нас прошито:
define('sdd_ftp_host','ftp.site.ru');// сервер для коннекта ftp
define('sdd_ftp_path','/public_html/');// путь к сайту по ftp
define('sdd_ftp_user','login');// пользователь для доступа ftp
define('sdd_ftp_pass','password');// пароль для входа на FTP
Сама непосредственно функция смены прав, позволяющая очень гибко управлять файлами.
function sd_chmod($_o,$_file,$_mode)// смена прав у файла
// server - ftp сервер для коннекта
// login - имя пользователя для входа на FTP
// password - пароль для доступа
// path - путь к файлам
{ // лог в функция ведется по максимуму
$log='';
$error=0;
$handle=@ftp_connect($_o['ftp_host']);// попытка соединиться сервер
if ($handle)
{ $log.='Connect to server '.$_o['ftp_host'].' successfull'."\r\n";// лог
// если логин и пароль на FTP подшли
if (@ftp_login($handle,$_o['ftp_user'],$_o['ftp_pass']))
{ $log.='Login and password successfull'."\r\n";// лог
// если установился нужный каталог
if (!(@ftp_chdir($handle,$_o['ftp_path'])===false))
{ $log.='Change ftp path: '.$_o['ftp_path']."\r\n";// лог
if (!(ftp_chmod($handle,$_mode,$_file)===false))// меняем нужные права доступа
{ $log.='Set mode '.$_mode.' to file '.$_file."\r\n";// лог
}
else// если смена прав произошла с ошибкой
{ $log.='Error set mode '.$_mode.' to file '.$_file."\r\n";// лог
}
}
else// если ошибка при смене каталога
{ $log.='Error change path: '.$_o['ftp_path']."\r\n";// лог
}
}
else// если логин или пароль не подошли.
{ $log.='Login or Password uncorrect'."\r\n";// лог
}
ftp_close($handle);// закрыть соединение
}
else// если нет связи с сервером
{ $log.='Server '.$_o['ftp_host'].' not found'."\r\n";// лог
}
$r['error']=$error;// возвращаем код ошибки если таковой имел место
$r['log_']=$log;// лог выполнения команды
return $r;// возвращаем номер ошибки
}
Расширенная функция, которая делает удобным вызов предыдущей функции:
function sdf_standart_chmod($_file_name,$_code)
// пример вызова sdf_standart_chmod('/images/catalog/groups_mini/000001.jpg',0755);
// $_file_name - файл, права которого требуется изменить
// $_code - код chmod прав. code должен передаваться без ковычек
{ // отделяем путь от файла, это требуется для корректности
$rr=explode('/',$_file_name);
$count=sizeof($rr);
$fp='';
if ($count>1)
{ $it=0;
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) - содержит имя файла + расширение
$o=array();
$o['ftp_host']=sdd_ftp_host;// адрес сервер, например ftp.site.ru
// путь, например public_html + относительный путь, который передан вместе с файлом
$o['ftp_path']=sdd_ftp_path.$fp.'/';
// избавляемся от ошибок в файловом пути.
$o['ftp_path']=str_replace('//','/',$o['ftp_path']);
$o['ftp_user']=sdd_ftp_user;// пользовать
$o['ftp_pass']=sdd_ftp_pass;// пароль
$r=sd_chmod($o,$fn,$_code);// присваиваем пути
return $r;
}
Сам вызовы функции происходит очень просто:
// устанавливаем соответствующие права
sdf_standart_chmod('/images/catalog/images.jpg',0755);
Незабывайте правильно прописать соответствующие define.
Желаю удачи