Функция mkdir для создания папок в PHP: варианты и практические примеры
Основные способы создания папок в PHP через mkdir
Каков базовый способ создать папку в PHP?
Функция mkdir принимает путь к новой директории, права доступа (по умолчанию 0777) и флаг рекурсивного создания. Она возвращает true при успехе и false при ошибке.
$folder = 'data';
if (mkdir($folder)) {
echo 'Папка data создана';
} else {
echo 'Не удалось создать папку';
}Php создать папку (создание папки в php (mkdir))
Папка data создана
При отсутствии прав на запись или если папка уже существует, mkdir генерирует warning. Рекомендуется предварительно проверять существование is_dir().
Типичные проблемы:
- Warning из-за существующей папки – решается проверкой is_dir().
- Отсутствие прав – проверить владельца и chmod родительской директории.
- Некорректные слеши в пути – использовать DIRECTORY_SEPARATOR.
Как создать папку только если её ещё нет, без лишних ошибок?
Комбинация is_dir и mkdir с проверкой исключает warning.
$path = 'uploads';
if (!is_dir($path)) {
mkdir($path, 0755);
echo 'Папка создана';
} else {
echo 'Уже существует';
}
Папка создана
Подавление ошибок через @ нежелательно, так как маскирует другие сбои.
Как рекурсивно создать несколько вложенных папок за один вызов?
Флаг recursive = true позволяет mkdir создавать все недостающие родительские директории.
$path = 'project/static/css';
if (mkdir($path, 0777, true)) {
echo 'Вложенная структура создана';
}
Вложенная структура создана
Если какой-то элемент пути является файлом, а не папкой, mkdir вернёт false. Проверяйте отсутствие конфликтов.
Как задать конкретные права доступа при создании папки?
Второй параметр определяет chmod. Окончательные права зависят от umask. Для принудительной установки можно вызвать chmod после создания.
$path = 'secure_dir';
mkdir($path, 0700); // только владелец
chmod($path, 0700); // дополнительная гарантия
(папка создана с правами 0700)
Umask может уменьшить установленные права. Если нужно точно 0777, сначала установите umask(0), затем mkdir, затем верните umask обратно.
Как обработать ошибки mkdir через исключения?
По умолчанию mkdir не бросает исключения. Можно преобразовать все ошибки в исключения с помощью пользовательского обработчика или использовать ErrorException.
set_error_handler(function($severity, $message, $file, $line) {
throw new ErrorException($message, 0, $severity, $file, $line);
});
try {
mkdir('/root/test'); // нет прав
} catch (ErrorException $e) {
echo 'Ошибка: ' . $e->getMessage();
}
restore_error_handler();
Ошибка: mkdir(): Permission denied
Не забывайте восстанавливать старый обработчик после блока, чтобы не повлиять на остальной код.
Как создать папку с именем, содержащим текущую дату?
Форматируйте строку с помощью date() и передавайте в mkdir.
$folder = 'backup_' . date('Y-m-d');
if (!is_dir($folder)) {
mkdir($folder, 0755);
}
echo 'Папка ' . $folder . ' готова';
Папка backup_2025-03-20 готова
Избегайте символов, недопустимых в именах папок (например, двоеточия в Windows). Используйте date('Y-m-d') без пробелов.
Как создать папку в системной временной директории?
Функция sys_get_temp_dir() возвращает путь к временной папке. В ней можно создавать подпапки.
$tmp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'my_app';
mkdir($tmp, 0700, true);
echo 'Временная папка: ' . $tmp;
Временная папка: /tmp/my_app
Временные папки могут быть очищены системой. Не храните там важные данные.
Расширенные примеры работы с mkdir в PHP
Создание структуры директорий из массива
Функция, которая принимает многомерный массив и создаёт все вложенные папки рекурсивно.
function createStructure(array $structure, string $base = ''): void {
foreach ($structure as $name => $children) {
$path = $base . DIRECTORY_SEPARATOR . $name;
if (!is_dir($path)) {
mkdir($path, 0755, true);
}
if (is_array($children)) {
createStructure($children, $path);
}
}
}
$tree = [
'app' => [
'Controllers' => [],
'Models' => [],
'Views' => ['layouts', 'partials']
],
'public' => ['css', 'js', 'images']
];
createStructure($tree, __DIR__);
echo 'Структура создана';
Структура создана (директории: app/Controllers, app/Models, app/Views/layouts, ...)
Убедитесь, что ключи массива не содержат спецсимволов, и передаётся корректный базовый путь.
Создание папки с правильным umask и возвратом к исходному состоянию
Иногда требуется создать папку с точными правами, игнорируя umask. Пример:
$old = umask(0);
mkdir('custom', 0777);
umask($old);
echo 'Права папки: ' . substr(sprintf('%o', fileperms('custom')), -4);
Права папки: 0777
Изменение umask влияет на весь процесс. После создания обязательно восстановить исходное значение.
Проверка успешности создания через error_get_last
Если mkdir возвращает false, можно получить детали последней ошибки.
$result = @mkdir('/forbidden');
if (!$result) {
$error = error_get_last();
echo 'Код: ' . $error['type'] . ', сообщение: ' . $error['message'];
}
Код: 2, сообщение: mkdir(): Permission denied
Для этой техники можно подавить warning с помощью @, но лучше использовать исключения, как описано ранее.
Создание папки с использованием абсолютного пути и текущего времени
Генерация уникального имени на основе timestamp и микросекунд.
$base = '/var/www/project/snapshots';
$name = 'snap_' . date('Ymd_His') . '_' . substr(microtime(), 2, 3);
$path = $base . DIRECTORY_SEPARATOR . $name;
mkdir($path, 0700, true);
echo 'Создана: ' . $path;
Создана: /var/www/project/snapshots/snap_20250320_142536_789
Слишком длинные имена могут превысить ограничение файловой системы. Учитывайте max length.