mkdir, почему permission denied при 0777? — Хабр Q&A

В этой ошибке указано, что php скрипт, расположенный тут:
/var/www/www-root/data/www/xndaasdqfjqwm7b.xn--p1ai/vendor/yiisoft/yii2/helpers/BaseFileHelper.php
видимо пытается создать папку ( mkdir() line 488)

Так какой именно папке вы права задаете?
Посмотрите в коде/логах, какую папку он пытается создать и где и вот там уже и назначайте права.

Ответ написан

Комментировать

А не-латинское имя папки Вас не смущает? Есть системы, которые очень нервно относятся к именам

Ответ написан

в 99% случаях это не понимание всей системы прав линукс
В вашем случае это скорее всего владельцы файлов и группы
По мима 777 так же у файла есть владелец и группа
1. отвечает что этот юзер попадет в первую семерку
вторая за вторую
3 соотваетственно все левые
права на файлы выгледят реально так
index.php root:root 777
В вашем случае вы оперируете самой маской 777
но не забываете что вы даже не тот пользователь.
А апачь может например не иметь прав создавать в этой директории.
Так что сделайте ls - l
посмотрите права
Далее поменяйте владельца на правильного
так

chown -R bitrix:bitrix /home/bitrix/ext_www/site.ru

В вашем случае скорее всего этоwww-data:www-dataили apache:apache
-R -рекурсивно
Команда потенциально опасная и пишите ее всегда с полным путем а не «.» уж больно шустро она меняет права.
ДАлее если все решилось то не работайте от рута а от того полльзователя от кооторого работает сайт.
Ну или меняйте права постоянно.
А вот если не заработало то нужно знать еще о нескольких моментах
Есть еще дополнительные права и даже утилиты ограничивающие скажем специфические вещи, например разрешающие только дописывать.

Или запрещающие удалять что-либо в этом каталоге но разрешающие создавать . это отдельная история.
В любом случае с вас ls -la текущей директории и такой же список с работоающей валидно
Так же есть специфические моды представления php которые запрещяют все что кроме 644 755, вплоть до 777 ;).

Ответ написан

А опечатки нет?
Права 777 или 0777?
Должны быть с нулём, в восьмеричной системе )

Еще, как вариант, может быть, на родительской папке висят какие-то ACL? Что говорит такая команда:
getfacl <имя-папки-в-которой-Вы-создаёте-подпапку>?

Ответ написан

Комментировать

Создание каталога в PHP с помощью функции mkdir

В этом руководстве показано, как можно создать каталог в PHP с помощью функции mkdir.

Функция mkdir в PHP — это простая, но мощная функция, которая позволяет вам создавать каталог везде, где у запущенного агента есть разрешение.

В самом прямом случае вы можете создать один каталог по указанному пути. Однако вы даже можете использовать эту функцию для создания целого дерева каталогов, включив его « рекурсивная ”функциональность.

Это основная часть PHP, полезная в различных случаях, когда вам нужно создавать папки на лету. Например, вы можете захотеть создать каталоги на основе текущей даты при обработке загрузок в PHP.

Вам может быть интересно, что делает каждый из этих параметров, так что давайте быстро пробежимся по ним. Мы покажем вам большую их часть в следующих разделах.

Определение функции mkdir в PHP

Прежде чем двигаться дальше, мы должны сначала коснуться того, как функция mkdir определена в PHP.

Ниже вы можете увидеть, как именно функция mkdir определена в PHP. Он поддерживает четыре параметра, но только первый требуется для использования его функций.

Эта функция вернет true , если каталог был успешно создан, и false в случае сбоя.

Вам может быть интересно, что делает каждый из этих параметров, так что давайте быстро пробежимся по ним. Мы приведем примеры того, как каждый параметр используется позже в этом руководстве.

Параметр каталога

Параметр « каталог » требуется и используется для указания пути к каталогу, который вы хотите создать с помощью этой функции.

Функция mkdir в PHP имеет полную поддержку как относительных ( ./newdir/ ), так и абсолютных путей ( /var/www/php/newdir ).

Однако здесь лучше использовать абсолютные пути, так как текущий рабочий каталог может быть не таким, как вы думаете.

Если вы хотите создать каталог относительно текущего файла PHP, вам нужно будет добавить к вашему каталогу « __DIR__ «. Эта константа содержит текущий рабочий каталог.

Например, используя пример с относительным путем, мы бы написали « __DIR__. '/newdir/' «.

Режим Параметр

С помощью параметра « режим » можно установить разрешения, которые должны быть назначены папке при ее создании.

По умолчанию PHP создаст каталог с разрешениями « 0777 » максимально широкого доступа. Владелец, группа и все остальные будут иметь полный доступ к этому каталогу.

Значение режима обычно должно быть определено как восьмеричное, то есть вы должны использовать следующий формат.

  • Первое число всегда должно быть 0.
  • Второе число указывает разрешения для владельца.
  • Третье число устанавливает разрешение для группы, которой принадлежит каталог.
  • Наконец, четвертое число устанавливает разрешения для всех остальных.

Значение для каждой из этих групп разрешений рассчитывается путем сложения следующих чисел.

  • 1 = Разрешения на выполнение
  • 2 = Разрешение на запись
  • 4 = Разрешение на чтение

Например, если бы мы хотели, чтобы владелец группы имел только права на чтение и запись, мы бы использовали « 6 » для этой группы. .

Вы можете узнать больше о том, как Linux обрабатывает разрешения, ознакомившись с нашим руководством по командам chmod.

Обратите внимание, что если вы работаете в системе на базе Windows, эта опция ничего не сделает.

Рекурсивный параметр

PHP-функция mkdir по умолчанию будет пытаться создать только последний сегмент пути.

Например, с путем «/var/www/example/» PHP создаст только конечный каталог «/example/». Если предыдущие каталоги не существуют, функция завершится ошибкой.

Вы можете установить для параметра « recursive » значение true , чтобы обойти это. Если установлено значение true , PHP будет выполнять каждую часть пути, создавая их, если они еще не существуют.

Параметр контекста

Параметр контекста является необязательным и позволяет вам управлять дескриптором файла, который будет использовать функция PHP mkdir.

В большинстве случаев вам не нужно использовать этот параметр. Это полезно только тогда, когда вам нужно контролировать файловый поток.

Основное использование функции mkdir в PHP

Давайте начнем с самого простого способа использования функции mkdir в PHP.

Самый простой способ использовать mkdir — передать каталог, который вы хотите создать. Функция предполагает, что для всех остальных параметров должны использоваться значения по умолчанию.

В следующем примере мы создадим каталог « /example/directory/».

Поскольку для рекурсии по умолчанию установлено значение false , часть « /example/» этого каталога уже должна существовать. В противном случае mkdir вернет false и не сможет создать каталог.

Аналогичным образом, поскольку мы не устанавливаем параметр « mode », разрешения по умолчанию « 0777 » устанавливаются при создании этой папки.

Установка разрешений на создание папок с помощью mkdir в PHP

Функция mkdir в PHP позволяет вам устанавливать разрешения для папок, которые она создает, используя параметр режима.

Вам все равно нужно будет указать каталог, который вы хотите создать, для первого параметра. В нашем примере ниже мы используем каталог «/example/directory/».

Мы можем установить разрешения, которые будут назначены этой новой папке со вторым параметром. Это должно быть восьмеричное значение.

  • Первое число должно оставаться 0 , так как это восьмеричное значение.
  • Вторая цифра — права пользователя. В нашем примере ниже мы установили это значение 7 .

    Использование 7 дает пользователю права на выполнение ( 1 ), запись ( 2 ) и чтение ( 4 ).

  • Третьим числом мы устанавливаем разрешения для группы, которой принадлежит файл.

    В нашем примере мы установим это число равным 5 . Это дает группе права на выполнение ( 1 ) и чтение ( 4 ).

  • Последнее и четвертое число позволяют установить разрешение для всех остальных пользователей.

    Как и в случае с групповым разрешением, в нашем примере мы также установили его равным 5.

Когда этот бит PHP будет выполнен, он будет использовать функцию mkdir для создания каталога « /example/directory/» с разрешением « 0755 ».

Создание родительских каталогов с помощью PHP-функции mkdir

Последний параметр, который мы покажем вам, как использовать, является рекурсивным. Это одна из самых полезных функций PHP-функции mkdir, поскольку она позволяет вам создать целую ветвь каталога одним вызовом функции.

Чтобы использовать это, мы должны сначала определить каталог и режим. Мы будем использовать «/example/full/directory/tree/» для нашего каталога, а для режима мы будем использовать значение по умолчанию « 0777 ».

Теперь все, что нам нужно сделать, это установить для третьего (рекурсивного) параметра значение true.

При передаче « true » в рекурсивный параметр mkdir обеспечит создание каждой части каталога.

Создать папку, если она не существует Использование mkdir в PHP

Хотя функция PHP mkdir помогает создать каталог, она не выполняет никаких проверок, чтобы увидеть, существует ли этот каталог перед запуском.

При использовании в уже существующем каталоге функция mkdir выдаст предупреждение о том, что он уже существует.

Чтобы избежать появления этого предупреждения в коде, мы можем использовать PHP « file_exists ”функция. Используя эту функцию, мы можем проверить, существует ли каталог, прежде чем продолжить.

Ниже у нас есть простой условный оператор PHP if, использующий функцию file_exists() для проверки существования каталога ( ! ).

Только если функция file file_exists вернет false , вызов функции mkdir будет запущен и наш каталог « /example/directory/tree/» будет создан.

Заключение

К концу этого руководства мы надеемся, что вы теперь понимаете, как функция mkdir работает в PHP.

Эта функция полезна, поскольку позволяет создавать каталоги в PHP. Он даже позволяет вам устанавливать разрешения для новых папок и рекурсивно создавать любые каталоги по указанному пути.

Конечно, пользователю, под которым работает PHP, потребуется разрешение на создание папок, поэтому убедитесь, что у вас правильно установлены разрешения.

Пожалуйста, прокомментируйте ниже, если у вас есть какие-либо вопросы об использовании функции mkdir.

Обязательно ознакомьтесь со многими другими нашими руководствами по PHP и другими нашими руководствами по программированию.

Отказано в разрешении на создание Docker, когда PHP-FPM пытается создать каталог

У меня есть этот docker-compose, с которым я экспериментирую. Я использую fastCGI от Nginx для запуска скрипта.

Версия docker-compose.yml :

: «3»
  Сервисы:
    psqldb:
      строить:
        контекст: .
        dockerfile: докер/psql/Dockerfile
        аргументы:
          UID: "${UID}"
          GID: "${GID}"
      перезапуск: всегда
      Окружающая среда:
        POSTGRES_USER: постгрес
        POSTGRES_PASSWORD: d;%f=68ZXJENER-R
        PGDATA: /pg-данные
      тома:
        - .
/докер/.данные/pgsql/:/pg-данные - ./docker/.log/pgsql/:/var/log/postgresql/ порты: - "5432:5432" phpapp: строить: контекст: ./ файл докеры: докер/php-fpm/Dockerfile_dev аргументы: UID: "${UID}" GID: "${GID}" перезапуск: если не остановлен Окружающая среда: DB_HOST: psqldb POSTGRES_PASSWORD: d;%f=68ZXJENER-R DEBUG_MODE: 1 тома: - ./docker/php-fpm/config/zzz-phpSettings.conf:/usr/local/etc/php-fpm.d/zzz-phpSettings.conf - ./docker/.log/phpfpm/:/var/log/ - ./phpcode/:/var/www зависит от: - psqldb

Файл PHP Docker:

 ИЗ php:8.0.9-fpm-alpine
ИДЕНТИФИКАТОР АРГ
АРГ ГИД
ЗАПУСК addgroup --gid докер GID
ЗАПУСК adduser --disabled-password --gecos '' --uid $UID --gid $GID докер
ПОЛЬЗОВАТЕЛЬСКОЕ окно настройки
РАБОЧИЙ КАТАЛОГ /var/www
ЗАПУСТИТЬ обновление apk \
ЗАПУСК apk добавить \
    база сборки \
    вим \
    цдата
# установить часовой пояс
ENV TZ=Европа/Прага
# ИСПРАВЛЕНИЕ для PDO-PGSQL
ВЫПОЛНИТЬ набор -ex \
  && apk --без кеша добавить \
    postgresql-dev
ЗАПУСК docker-php-ext-install pdo pdo_pgsql
ВЫСТАВИТЬ 9000
 

Проблема в том, что каталоги тома для журнала и данных создаются под пользователем ROOT, а не под указанным пользователем.