W3docs

closedir()

Функция closedir() в PHP освобождает системные ресурсы, выделенные для дескриптора директории, и предотвращает утечки памяти.

Введение

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

Понимание функции closedir

Функция closedir() закрывает дескриптор директории, который был ранее открыт с помощью opendir(). После закрытия дескриптора нельзя считывать из него записи с помощью readdir() до повторного открытия директории.

Синтаксис функции PHP closedir()

closedir(resource $dir_handle): void
  • $dir_handle — дескриптор директории, возвращённый функцией opendir(). Этот параметр необязателен: если он опущен, PHP закрывает последний дескриптор директории, открытый функцией opendir().

Функция не возвращает никакого значения (void). Она просто освобождает базовый системный ресурс, поэтому нет ничего, что нужно сохранять в переменной.

Закрытие дескриптора директории

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

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

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

Пример использования функции closedir() в PHP

<?php

$dir_handle = opendir('.');

if ($dir_handle !== false) {
    while (($entry = readdir($dir_handle)) !== false) {
        echo $entry . "\n";
    }
    closedir($dir_handle);
}

При запуске в директории, содержащей index.php и style.css, будет выведено примерно следующее:

.
..
index.php
style.css

Сначала мы открываем директорию с помощью opendir(), считываем каждую запись с помощью readdir() в цикле, а затем освобождаем дескриптор с помощью closedir().

Всегда закрывайте дескриптор с помощью try...finally

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

<?php

$dir_handle = opendir('/path/to/directory');

if ($dir_handle !== false) {
    try {
        // Do something with the directory handle that might throw
        while (($entry = readdir($dir_handle)) !== false) {
            // process $entry
        }
    } finally {
        closedir($dir_handle);
    }
}

Блок finally выполняется независимо от того, завершился ли цикл в штатном режиме или было выброшено исключение, гарантируя освобождение ресурса.

Распространённые ошибки при использовании closedir

Одна из распространённых ошибок при работе с closedir — попытка закрыть дескриптор директории дважды. После закрытия дескриптора директории его нельзя закрыть повторно. Попытка сделать это вызовет предупреждение.

Другая распространённая ошибка — отсутствие проверки валидности дескриптора директории перед его закрытием. Функция opendir() возвращает false при неудаче, поэтому всегда убеждайтесь, что дескриптор не равен false (как в приведённых выше примерах), прежде чем передавать его в closedir(). Передача недопустимого дескриптора вызовет TypeError или предупреждение в зависимости от версии PHP.

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

Связанные функции

  • opendir() — открывает дескриптор директории для чтения.
  • readdir() — считывает следующую запись из открытого дескриптора директории.
  • rewinddir() — сбрасывает дескриптор обратно к началу директории.
  • scandir() — возвращает все записи директории в виде array за один вызов (без необходимости вручную закрывать дескриптор).

Заключение

Функция closedir() необходима для освобождения системных ресурсов, выделенных для потока директории. Правильное её использование — с проверкой валидности дескриптора и оборачиванием операций в блок try...finally — предотвращает предупреждения и утечки памяти. Следование этим рекомендациям обеспечивает эффективную и надёжную работу вашего PHP-кода.

Практика

Практика
Что делает функция PHP closedir()?
Что делает функция PHP closedir()?
Was this page helpful?