Mkdir: примеры (PHP)

Создание директорий в PHP с помощью функции mkdir
Раздел: Работа с файловой системой
mkdir(string $directory, int $permissions = 0777, bool $recursive = false, ?resource $context = null): bool
Основные сведения о функции mkdir

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

Синтаксис функции выглядит следующим образом:

mkdir(string $directory, int $permissions = 0777, bool $recursive = false, ?resource $context = null): bool
Аргументы функции
  • directory (строка): Путь к создаваемой директории. Может быть абсолютным или относительным.
  • permissions (целое число): Права доступа к директории, задаваемые в восьмеричной системе. По умолчанию 0777, что означает максимальные права. На конечные права влияет umask текущего процесса.
  • recursive (логическое значение): Если установлено в true, функция создаст все вложенные директории, указанные в пути. По умолчанию false.
  • context (ресурс): Контекст потока для операций с файловой системой. Используется редко, в основном при работе с удаленными файловыми системами через обертки (wrappers).

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

Простые примеры использования
Создание одной директории

$result = mkdir('new_folder');
var_dump($result);
// Результат (если директория создана успешно):
bool(true)
Создание директории с явными правами

$result = mkdir('protected_folder', 0755);
var_dump($result);
// Результат:
bool(true)
// Фактические права будут 0755 & ~umask
Рекурсивное создание структуры каталогов

$result = mkdir('level1/level2/level3', 0777, true);
var_dump($result);
// Результат:
bool(true)
// Будут созданы все три вложенные директории
Пример с ошибкой (директория уже существует)

mkdir('existing_folder');
$result = mkdir('existing_folder');
var_dump($result);
// Результат:
bool(false)
// Также будет сгенерировано предупреждение (Warning)
Похожие функции в PHP
mkdir с проверкой существования

Часто используется комбинация с функцией is_dir для предотвращения ошибок:


if (!is_dir('my_folder')) {
    mkdir('my_folder');
}

Функция umask устанавливает маску прав по умолчанию для текущего процесса, что влияет на конечные права создаваемых файлов и директорий. Ее использование предпочтительнее, когда необходимо глобально изменить права для всех операций создания.

Функция rmdir выполняет противоположное действие — удаляет пустую директорию. Для рекурсивного удаления используется RecursiveDirectoryIterator или внешние команды.

FilesystemIterator

Классы FilesystemIterator и DirectoryIterator предоставляют объектно-ориентированный интерфейс для работы с файловой системой, включая создание директорий через обертки.

Типичные ошибки
Попытка создания существующей директории

mkdir('existing_dir'); // Успешно
$result = mkdir('existing_dir'); // Ошибка
Warning: mkdir(): File exists in ...
bool(false)
Недостаточно прав для записи

// Попытка создать директорию в системном каталоге без прав суперпользователя
$result = mkdir('/usr/my_app_folder');
var_dump($result);
Warning: mkdir(): Permission denied in ...
bool(false)
Некорректный путь

$result = mkdir(''); // Пустая строка
var_dump($result);
Warning: mkdir(): No such file or directory in ...
bool(false)
Использование относительного пути при отключенном safe_mode

При неправильной настройке могут возникать ошибки из-за ограничений open_basedir.

Изменения в последних версиях PHP
PHP 8.0.0

Аргумент permissions стал необязательным в явном виде, хотя и ранее имел значение по умолчанию. Это изменение скорее формальное.

PHP 7.0.0

Добавлена возможность указания контекста потока (context) как nullable-типа.

Историческое изменение (PHP 5.0.0)

Был введен аргумент recursive, позволяющий создавать вложенные директории.

В PHP 8 функция стала более строгой к типам передаваемых аргументов, что предотвращает некоторые классы ошибок времени выполнения.

Расширенные примеры
Создание директории с уникальным именем
Пример php

$basePath = 'uploads/';
$dirName = uniqid('session_', true);
$fullPath = $basePath . $dirName;

if (mkdir($fullPath, 0700, true)) {
    echo "Директория создана: $fullPath";
} else {
    echo "Ошибка создания директории";
}
// Результат (пример):
Директория создана: uploads/session_6065f7b3a5a123.456789
Использование контекста потока
Пример php

$context = stream_context_create([
    'ftp' => [
        'overwrite' => false
    ]
]);

// Пример для FTP (требуется расширение FTP)
// mkdir('ftp://user:pass@example.com/newdir', 0777, false, $context);
Обработка ошибок с созданием полного пути
Пример php

function createDirectorySafe($path, $permissions = 0755) {
    if (is_dir($path)) {
        return true;
    }
    
    $parent = dirname($path);
    if (!is_dir($parent)) {
        createDirectorySafe($parent, $permissions);
    }
    
    return mkdir($path, $permissions);
}

$result = createDirectorySafe('deep/nested/structure/test');
var_dump($result);
bool(true)
Создание временной директории для обработки файлов
Пример php

$tempDir = sys_get_temp_dir() . '/my_app_' . getmypid();
if (!is_dir($tempDir)) {
    mkdir($tempDir, 0700);
    // Установка обработчика для удаления при завершении
    register_shutdown_function(function() use ($tempDir) {
        array_map('unlink', glob($tempDir . '/*'));
        rmdir($tempDir);
    });
}
echo "Рабочая директория: $tempDir";
Работа с правами и umask
Пример php

$oldUmask = umask(0);
mkdir('strict_folder', 0755);
// Права будут точно 0755
umask($oldUmask); // Восстановление маски
Аналоги в других языках программирования

Mkdir в Python

В Python для создания директорий используется функция os.mkdir (одна директория) или os.makedirs (рекурсивное создание).


import os
os.mkdir('new_folder')  # Одна директория
os.makedirs('a/b/c', exist_ok=True)  # Рекурсивно, exist_ok предотвращает ошибку если существует
JavaScript (Node.js)

В Node.js используется асинхронный метод fs.mkdir или его синхронная версия fs.mkdirSync с опцией recursive.


const fs = require('fs');
fs.mkdir('new_folder', { recursive: true }, (err) => {
    if (err) throw err;
});
// Или синхронно:
fs.mkdirSync('new_folder', { recursive: true });

Mkdir в MySQL

В MySQL не существует прямой аналогии, так как это СУБД, а не язык для работы с файловой системой. Однако для работы с каталогами данных сервера используются системные переменные и SQL-операторы вроде CREATE TABLESPACE.

Bash/Shell

В shell-скриптах используется команда mkdir с ключом -p для рекурсивного создания.


mkdir -p /path/to/nested/directory

PHP mkdir function comments

En
Mkdir Makes directory