W3docs

delete()

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

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

На этой странице рассматривается, что делает unlink(), типичные ловушки (отсутствие файла, права доступа, относительные пути) и связанные функции, которые используются, когда unlink() не подходит — например, rmdir() для каталогов и glob() для удаления множества файлов за раз.

Удаление файла (unlink()) — это не то же самое, что удаление записей из базы данных: для последнего выполняется SQL-запрос DELETE, а не операция с файловой системой.

Синтаксис

unlink(string $filename, ?resource $context = null): bool
  • $filename — путь к файлу, который нужно удалить. Может быть абсолютным (/var/www/data.txt) или относительным рабочего каталога скрипта (uploads/data.txt).
  • $context — (необязательный) контекст потока, используется только со stream-обёртками, такими как ftp://. Для локальных файлов требуется редко.

unlink() возвращает true при успехе и false при ошибке. При ошибке также генерируется предупреждение E_WARNING — например, если файл не существует или процесс не имеет прав на его удаление.

Всегда проверяйте результат

Вызов unlink("file.txt") без проверки молча записывает предупреждение в журнал, если файл отсутствует. Проверяйте возвращаемое значение и, если файл может не существовать, используйте file_exists() заранее, чтобы не вызвать предупреждение:

$path = "report.txt";

if (file_exists($path)) {
    if (unlink($path)) {
        echo "Deleted $path\n";
    } else {
        echo "Could not delete $path (check permissions)\n";
    }
} else {
    echo "Nothing to delete: $path does not exist\n";
}

Примеры

Пример 1: Создать файл, а затем удалить его

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

$path = sys_get_temp_dir() . "/w3docs-demo.txt";

file_put_contents($path, "temporary data");
echo "Exists before delete? " . (file_exists($path) ? "yes" : "no") . "\n";

unlink($path);
echo "Exists after delete?  " . (file_exists($path) ? "yes" : "no") . "\n";

Вывод:

Exists before delete? yes
Exists after delete?  no

Пример 2: Удалить все подходящие файлы с помощью glob()

unlink() удаляет по одному файлу за вызов, поэтому для очистки набора файлов объедините его с glob(), который возвращает array подходящих путей:

foreach (glob("/tmp/cache/*.tmp") as $file) {
    unlink($file);
}

Это удалит все файлы .tmp в /tmp/cache. Тот же шаблон является стандартным способом «очистить» каталог от файлов перед удалением самого каталога с помощью rmdir() (который работает только с пустыми каталогами).

Пример 3: Удалить файл через stream-обёртку

unlink() работает со stream-обёртками, в том числе с удалёнными. Необязательный параметр $context позволяет передать параметры, специфичные для обёртки:

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

unlink("ftp://example.com/old-export.txt", $context);

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

  • Файл не существует. unlink() возвращает false и выдаёт предупреждение. Используйте file_exists() или подавите и проверьте: @unlink($path).
  • Права доступа. Удаление зависит от права на запись в содержащем каталоге, а не в самом файле. Процесс PHP (часто www-data) должен владеть этим каталогом или иметь право на запись в него.
  • Относительные пути. Относительный путь разрешается относительно текущего рабочего каталога, который не всегда совпадает с папкой скрипта. Предпочитайте абсолютные пути или создавайте их с помощью __DIR__.
  • Это каталог. unlink() не может удалять каталоги — используйте rmdir() для пустого каталога и сначала удалите его содержимое.
  • Файл открыт. В Windows удаление файла, который всё ещё открыт дескриптором, завершится ошибкой; сначала закройте его. В Unix unlink выполняется успешно, но данные сохраняются до закрытия дескриптора.

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

  • rmdir() — удалить пустой каталог.
  • file_exists() — проверить существование пути перед удалением.
  • rename() — переместить или переименовать файл вместо удаления.
  • copy() — скопировать файл перед перезаписью или удалением оригинала.
  • glob() — получить список файлов по шаблону и удалить их в цикле.

Заключение

Используйте unlink() для удаления одного файла, всегда проверяйте возвращаемое значение и используйте file_exists() в качестве защиты, если файл может отсутствовать. Для каталогов применяйте rmdir(), а для пакетного удаления объединяйте unlink() с glob().

Практика

Практика
Какая функция удаляет один файл из файловой системы в PHP?
Какая функция удаляет один файл из файловой системы в PHP?
Was this page helpful?