1

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

Руководство по функции chdir в PHP с подробными примерами
Раздел: Работа с файловой системой
chdir(string $directory): bool
Функция chdir в PHP

Функция chdir (change directory) изменяет текущий рабочий каталог PHP-скрипта на указанный путь. Она используется, когда необходимо переключить контекст выполнения для операций с файловой системой, например, для открытия файлов относительно нового каталога, сканирования директории или запуска внешних программ.

Аргументы функции

Функция принимает один обязательный аргумент:

  • directory (string) - путь к новой текущей директории. Может быть абсолютным или относительным.

Функция возвращает true в случае успеха и false при возникновении ошибки (например, если указанный каталог не существует или отсутствуют права на доступ).

Примеры использования chdir
Базовое переключение директории

Переход в указанную папку.

$oldCwd = getcwd();
echo 'Текущий каталог до: ' . $oldCwd . '<br>';
if (chdir('/tmp')) {
    echo 'Текущий каталог после: ' . getcwd() . '<br>';
} else {
    echo 'Не удалось сменить директорию.<br>';
}
chdir($oldCwd); // Возврат назад
Текущий каталог до: /var/www/html
Текущий каталог после: /tmp
Обработка ошибки

Попытка перейти в несуществующий каталог.

$result = @chdir('/несуществующий/путь');
if ($result === false) {
    echo 'Ошибка смены директории.<br>';
}
Ошибка смены директории.
Похожие функции в PHP
  • getcwd() - возвращает абсолютный путь текущего рабочего каталога. Часто используется вместе с chdir для сохранения и восстановления пути.
  • realpath() - преобразует относительный или абсолютный путь в канонизированный абсолютный путь, убирая символические ссылки и компоненты '.' и '..'. Полезна для получения полного пути перед использованием chdir.
  • dirname() - возвращает путь к родительской директории файла. Может использоваться для построения путей относительно текущего скрипта.

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

Типичные ошибки
Игнорирование возвращаемого значения

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

chdir('/неизвестная_директория');
$file = fopen('myfile.txt', 'r'); // Предупреждение или ошибка
Warning: fopen(myfile.txt): Failed to open stream: No such file or directory in ...
Использование относительных путей после chdir

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

chdir('/var/www');
include 'config.php'; // Будет искать /var/www/config.php, а не относительно исходного скрипта.
Попытка перейти в файл вместо директории
if (!chdir('/etc/passwd')) {
    echo 'Это файл, а не директория.';
}
Это файл, а не директория.
Изменения в версиях PHP

Функция chdir оставалась стабильной на протяжении многих версий. В PHP 8.0 не было внесено значительных изменений в её поведение или сигнатуру. Важно отметить, что с PHP 5.4 и более поздних версий, chdir() не влияет на каталог, в котором работает веб-сервер, если только он не запущен в режиме CLI. В режиме CGI или модуля веб-сервера изменение каталога обычно ограничено временем выполнения скрипта.

Расширенные примеры
Временное переключение для обработки файлов
Пример php
function processFilesInDir($dirPath) {
    $oldCwd = getcwd();
    if (!chdir($dirPath)) {
        return false;
    }
    $files = scandir('.');
    $result = [];
    foreach ($files as $file) {
        if (pathinfo($file, PATHINFO_EXTENSION) === 'txt') {
            $result[] = $file;
        }
    }
    chdir($oldCwd); // Важно вернуться
    return $result;
}
print_r(processFilesInDir('/tmp'));
Array
(
    [0] => log1.txt
    [1] => data.txt
)
Рекурсивный обход с изменением каталога

Использование chdir вместе с рекурсивным итератором может упростить обработку вложенных структур.

Пример php
function listDirectoriesRecursively($startDir) {
    $iter = new RecursiveDirectoryIterator($startDir, FilesystemIterator::SKIP_DOTS);
    foreach (new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::CHILD_FIRST) as $item) {
        if ($item->isDir()) {
            echo $item->getPathname() . "<br>";
        }
    }
}
// chdir здесь может не потребоваться, если использовать абсолютные пути в итераторе.
Работа с символическими ссылками

chdir переходит по символическим ссылкам на директории.

Пример php
// Предположим, /tmp/link -> /var/tmp
symlink('/var/tmp', '/tmp/link');
chdir('/tmp/link');
echo 'Текущий каталог: ' . getcwd();
Текущий каталог: /var/tmp
Смена каталога для запуска внешней команды
Пример php
$output = [];
$return_var = 0;
chdir('/tmp');
exec('ls -la', $output, $return_var); // Команда выполняется в /tmp
print_r($output);
Аналоги в других языках

Chdir в Python

Функция os.chdir(path). При ошибке вызывает исключение OSError.

import os
old = os.getcwd()
try:
    os.chdir('/tmp')
    print(os.getcwd())
except OSError as e:
    print(f'Ошибка: {e}')
/tmp
JavaScript (Node.js)

Метод process.chdir(directory). При ошибке генерирует исключение.

const process = require('process');
let old = process.cwd();
try {
    process.chdir('/tmp');
    console.log(process.cwd());
} catch (err) {
    console.error(`Ошибка: ${err}`);
}
/tmp

Chdir в MySQL

Прямого аналога в SQL нет, так как это язык запросов к СУБД, а не для работы с файловой системой сервера.

PHP chdir function comments

En
Chdir Change directory