W3docs

unlink()

Функция unlink() в PHP удаляет файл из файловой системы. Синтаксис, параметры, права доступа и типичные ошибки.

Введение

Функция PHP unlink() удаляет один файл из файловой системы. Название происходит от системного вызова Unix unlink, который убирает имя («ссылку»), указывающее на данные файла. Когда удаляется последняя ссылка на файл, сам файл освобождается.

В этой главе рассматриваются синтаксис, возвращаемое значение, правила доступа, а также — не менее важно — подводные камни: подавление предупреждений, удаление только при наличии файла и то, почему unlink() не может удалять директории.

Синтаксис

unlink(string $filename, ?resource $context = null): bool

Параметры

  • $filename — путь к удаляемому файлу. Может быть относительным к текущей рабочей директории или абсолютным.
  • $context (необязательный) — ресурс контекста потока, используемый в продвинутых случаях, например при удалении через обёртку потока (например, FTP). Редко требуется.

Возвращаемое значение

  • true, если файл успешно удалён.
  • false, если операция не удалась — например, файл не существует, путь указывает на директорию или у процесса нет прав. При ошибке PHP также генерирует E_WARNING.

unlink() является аналогом функций, создающих файлы, таких как fopen() и file_put_contents().

Простой пример

Всегда проверяйте возвращаемое значение, чтобы скрипт знал, произошло ли удаление на самом деле:

<?php
// Create a file so we have something to delete.
file_put_contents('example.txt', 'temporary data');

if (unlink('example.txt')) {
    echo "File deleted successfully.";
} else {
    echo "Failed to delete the file.";
}

Вывод:

File deleted successfully.

Удаление только при наличии файла

Вызов unlink() для несуществующего файла возвращает false и выдаёт предупреждение. Защитите вызов с помощью file_exists() (или is_file()), чтобы избежать лишних предупреждений:

<?php
$path = 'cache/report.tmp';

if (file_exists($path)) {
    unlink($path);
    echo "Removed: {$path}";
} else {
    echo "Nothing to remove.";
}

Если cache/report.tmp не существует, выводится Nothing to remove. вместо генерации предупреждения.

Корректная обработка ошибок

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

<?php
$path = 'logs/old.log';

if (!@unlink($path)) {
    // file_exists() distinguishes "already gone" from a real permission error.
    if (file_exists($path)) {
        echo "Could not delete {$path} — check permissions.";
    } else {
        echo "File was already gone.";
    }
}

Права доступа: кто может удалить файл

Распространённый сюрприз: право на удаление файла контролируется директорией, а не самим файлом. Чтобы удалить файл, PHP-процессу (например, пользователю веб-сервера www-data) необходимы права на запись и выполнение для директории, содержащей файл — даже если сам файл доступен только для чтения. Если возникают ошибки «отказано в доступе», проверяйте права родительской директории, а не только самого файла.

Удаление нескольких файлов

unlink() удаляет по одному файлу за раз. Чтобы удалить несколько файлов, соответствующих шаблону, комбинируйте его с glob():

<?php
// Delete every .tmp file in the cache directory.
foreach (glob('cache/*.tmp') as $file) {
    unlink($file);
}

glob() возвращает массив совпадающих путей (или пустой массив, если ничего не найдено), поэтому цикл просто ничего не делает, когда нечего удалять.

unlink() работает только с файлами. Если передать ей директорию, она завершится ошибкой и выдаст предупреждение. Для удаления директорий используйте rmdir() — и обратите внимание, что rmdir() работает только с пустыми директориями. Удаление непустой директории означает сначала удаление её содержимого (unlink() для файлов и rmdir() для поддиректорий), а затем удаление самой директории.

Типичные ошибки

  • Файл должен существовать. Отсутствующий файл вернёт false и выдаст предупреждение. Сначала проверяйте через file_exists().
  • Операция необратима. unlink() не перемещает файл в корзину; данные удаляются немедленно.
  • Не для директорий. Для директорий используйте rmdir().
  • Кэш stat. После удаления файла PHP может продолжать сообщать, что он существует, из-за кэша stat. Вызывайте clearstatcache(), если повторно проверяете тот же путь в цикле.
  • Открытые дескрипторы файлов. В Windows нельзя удалить файл, который ещё открыт — сначала закройте его с помощью fclose(). В Unix удаление допустимо, но данные сохраняются до закрытия последнего дескриптора.

Заключение

unlink() — это простой способ удалить один файл в PHP, возвращающий true при успехе и false (плюс предупреждение) при ошибке. Ключевые практики: проверяйте существование файла перед удалением, всегда анализируйте возвращаемое значение, помните, что право на удаление определяется директорией, и используйте rmdir() для удаления директорий. Для более широкого представления о чтении, записи и управлении файлами смотрите PHP File Handling.

Практика

Практика
Для чего предназначена функция 'unlink()' в PHP?
Для чего предназначена функция 'unlink()' в PHP?
Was this page helpful?