Синтаксис g+w
недопустим для PHP, как и для большинства языков программирования, поскольку базовая операционная система не имеет понятия об этих значениях.Системный вызов chmod
принимает только восьмеричные значения, а не строки.В вашей системе в исполняемом файле командной строки chmod
реализован синтаксический анализатор для реализации этой пользовательской функции.
Хотя ваш пример «работает», он приведет к нежелательным результатам, если файл уже имеет g + w, как добавление другого20 включит дополнительные биты и предоставит файлу дополнительные разрешения, которые вы не намеревались.Например, если разрешение файла было 020
и вы добавили к нему 020
, оно стало бы 040
.
Разрешения файла Posix - это восьмеричные биты, где каждая цифра представляет комбинацию чтения, записи ивыполнить.Так как операция добавления (+
) является неправильной, вам вместо этого нужно использовать побитовые операции, такие как AND
и OR
, чтобы включить или выключить отдельные биты.Для PHP, C, C ++ и большинства распространенных языков оператор AND - это символ амперсанда (&
), а оператор OR - это символ канала (|
).Поскольку мы хотим включить биты, нам нужно использовать оператор ИЛИ.
Правильный способ справиться с этим:
$filePermission = fileperms('myFile.txt');
chmod('myFile.txt', $filePermission | 020);
Обратите внимание, что я поставил перед числом 0
, это заставит PHP интерпретировать число как восьмеричное, а не как десятичное число.
Недавно я сделал видео об этом, чтобы попытаться помочь людям понять chmod
и как работает восьмеричная запись, это может помочь вам счто вы пытаетесь достичь.https://www.youtube.com/watch?v=j8FLsxdl0ns
Если вы хотите иметь дружественную поддержку menomic в качестве бинарного файла командной строки, вам нужно будет реализовать синтаксический анализатор самостоятельно или вызвать двоичный файл командной строки из PHP, например:
exec('/bin/chmod ' . escapeshellarg($perms) . ' ' . escapeshellarg($file));
Обратите внимание, что это использование намного медленнее, чем использование встроенной функции chmod
в PHP напрямую.Это также может открыть вас для потенциальных проблем безопасности.