‹
|
Последняя модификация: 10.08.2014 г Страница загружена с адреса: http://webdesign.site3k.ru/consulting/php_chmod.html
PHP chmod – установка и чтение прав доступаФункция chmod языка PHP может вызвать неожиданное затруднение. Понятный и простой, на первый взгляд, синтаксис: chmod(filename, attrib); в котором filename определяет имя файла или каталога, для которого трубуется изменить атрибут (режим доступа), а attrib – режим, который требуется установить, имеет ряд скрытых особенностей. Первой из них, является, конечно же, сетевая система прав доступа, утанавливающая отдельно права для владельца файла, группы, к которой он относится и всех остальных пользователей. Права, обычно представляются строками: drwxr-x--x -rw-r--r-- Первый символ описывает тип элемента: дефис "-" означает файл, символ "d" означает каталог. Дальнейшие девять символов описывают права доступа: r – read право на чтение w – write право на запись x – execute право на выполнение* *право на выполнение для каталога означает возможность просмотреть его содержимое (войти в каталог). Первые три символа из девяти устанавливают права доступа для владельца, вторые три - для группы, третьи - для всех пользователей. Каждый набор символов r, w, x показывает текущие установленные права доступа для каждой категории пользователей. Если вместо символа стоит дефис, то соответствующее право отсутствует. Однако, PHP команда chmod не признает указание прав доступа в виде текстовой строки. Права доступа для нее обятельно должны указываться в виде числа от 0 до 7, для каждого типа пользователей. Чтобы понять, как преобразовываются числовые значения в текстовые и, наоборот, полезно представить текстовыу строку в виде битовой маски для однозначности которой необходимо строгое соблюдение порядка атрибутов: 1 группа цифр относится к владельцу файла, вторая к его группе, третья – к остальным пользоватлям. Кроме того, необходимо соблюдать последовательность прав: 1 право чтения, 2 – право записи, 3 – право выполнения. При соблюдении этих условий, приведенные выше строки drwxr-x--x -rw-r--r-- Можно представить как набор двоичных данных: 100.0.111.101.001 1.0.0.110.100.100 (Это фактический набор атрибутов, с точки зрения PHP команды chmod важны лиш последние три набора в каждой строке). Единица в последних трех группах каждой строки означает наличие права (истину), ноль – его отсутствие (ложь). Преобразование данного представления в десятиричный формат дает более привычное числовое представление:
Побитовое сложение (сдвиг) значений прав для каждой группы пользователей позволяет сократить десятиричную запись до одного числа в каждой группе:
Таким образом маска атрибутов для вышеуказаного примера (показаны только последние три группы, имеющие значение для прав доступа): В текстовом формате имеет вид: rwx.r-x.--x rw-.r--.r-- В двоичном: 111.101.001 110.100.100 А в десячичном, приобретает вид: 7.5.1 6.4.4 Именно в таком виде, только без разделяющих точек, и принимает PHP команда chmod значение атрибутов, корорые следует установить. Но, и это не все! Нельзя просто вписать в PHP-скрипт команду
chmod('myscript.php', 755);
Чтобы сделать файл myscript.php выполняемым: Команда chmod принимает значение прав только в 8-ричном формате! Ну что тут поделаеш – разработчики PHP специально усложняли нам жизнь, чтобы наши мозги не атрофировались. ☺ Чтобы команда chmod нормально выполнялась, ей нужно указать преобразование в 8-ричный формат, поставив перед значением прав ноль:
chmod('myscript.php', 0755);
Вы думаете это все? Позвольте! Зачем так упрощать себе жизнь? Разработчики PHP позаботились о том, чтобы эта статья не закончилась так просто. Добавление ноля перед атрибутами хорошо действует, когда вы заранее знаете, какой нужен атрибут. А если нужно сделать так, чтобы права выставлялись формой на HTML-странице? К примеру, вы хотите создать систему управления файлами? Допустим, из формы приходит переменная $attrib, содержащая значение прав доступа, типа 755. Вы думаете что, приклеете к ним ноль:
chmod('myscript.php', '0'.$attrib);
и, все у вас получится? Ага, размечтались. Разработчики PHP не позаботились об автоматическом преобразовании десятичного числа в восмиричное, будут они вам строки преобразовывать? Нет, конечно. Самим придется потрудиться:
chmod('myscript.php',octdec($attrib));
вставляя функцию octdec преобразования числа (или строки, имеющей числовае значение) в восьмиричный формат. Или используя функцию eval:
eval("chmod('myscript.php',0$attrib);");
Да, теперь все заработает. Но только на запись! Попробуйте считать атрибуты функией fileperms и не опплеваться: она вернет все в том же восьмиричном формате! Лично я теряюсь в интерпритации таких значений. Для нормального восприятия, их приходтся предварительно преобразовывать функцией decoct в десятиричный формат, а затем, из полученного результата брать последние 3 символа:
substr(
decoct(fileperms('myscript.php')),
strlen(decoct(fileperms('myscript.php')))-3,
strlen(decoct(fileperms('myscript.php')))
);
Только так можно получить нормальные числовые атрибуты. Преобразовав каждое из трех цифр в двоичный формат лекго получить буквенное представление прав доступа:
$perms=decoct(fileperms('myscript.php'));
$len=strlen($perms);
if ($len==5){ // вместо длины можно использовать is_dir() и другие методы
$attrib='d';// каталог
}else{
$attrib='-';// файл
}
// 1 метод: Вычисление через двоичное преобразование
for($i=$len-3; $i < $len; $i++){
@$attrib2=decbin(substr($perms,$i,1));
if (substr($attrib2,0,1)==1){
$attrib.='r';
}else{
$attrib.='-';
}
if (substr($attrib2,1,1)==1){
$attrib.='w';
}else{
$attrib.='-';
}
if (substr($attrib2,2,1)==1){
$attrib.='x';
}else{
$attrib.='-';
}
}
// 2 метод: Прямое вычисление (закомментирован)
//for($i=$len-3; $i < $len; $i++){
// switch (substr($perms,$i,1)) {
// case 0:
// $attrib.='---';
// break;
// case 1:
// $attrib.='--x';
// break;
// case 2:
// $attrib.='-w-';
// break;
// case 3:
// $attrib.='-wx';
// break;
// case 4:
// $attrib.='r--';
// break;
// case 5:
// $attrib.='r-x';
// break;
// case 6:
// $attrib.='rw-';
// break;
// case 7:
// $attrib.='rwx';
// break;
// }
//}
Но числовой формат во многих случаях окажется удобней буквенного (сравните 755 и -rwxr-xr-x, что быстрее понимается?). Вот теперь на языке PHP можно создавать файловые менеджеры и системы управления файлами (однако изменить атрибуты в файлах, загруженых по ftp, может не позволить сервер из-за принадлежности к разным группам).
< Предыдущая (Экспорт и импорт) PHP chmod Следующая (Web 2.0)>
![]()
|