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

Удаление файлов в PHP с помощью функции unlink
Раздел: Работа с файловой системой
unlink(string filename [, resource context]): bool
Функция unlink в PHP

Функция unlink() предназначена для удаления файла в файловой системе сервера. Она применяется, когда требуется программно избавиться от ненужного или временного файла, например, после обработки загрузки пользователя, очистки кеша или удаления устаревших логов.

Синтаксис и аргументы

Синтаксис функции:

bool unlink ( string $filename [, resource $context ] )

$filename (обязательный): Путь к удаляемому файлу. Может быть абсолютным или относительным. Важно иметь правильные права на запись в директории файла.

$context (опциональный): Ресурс контекста потока, созданный с помощью функции stream_context_create(). Используется для модификации поведения операции, например, при работе с HTTP или FTP. В большинстве случаев не требуется.

Функция возвращает true при успешном удалении и false в случае неудачи.

Простые примеры использования
Базовое удаление файла
<?php
$file = 'test.txt';
if (file_exists($file)) {
    if (unlink($file)) {
        echo "Файл удален.";
    } else {
        echo "Не удалось удалить файл.";
    }
} else {
    echo "Файл не существует.";
}
?>
Файл удален.
Удаление с проверкой результата
<?php
$result = unlink('old_data.csv');
var_dump($result);
?>
bool(true)
Попытка удаления несуществующего файла
<?php
$result = @unlink('ghost_file.txt'); // Используем @ для подавления предупреждения
var_dump($result);
?>
bool(false)
Похожие функции в PHP

rmdir() - Удаляет пустую директорию. Применяется для работы с каталогами, а не файлами.

rename() - Переименовывает или перемещает файл. Может использоваться как альтернатива удалению с последующим созданием, если нужен эффект "замены".

file_exists() - Проверяет существование файла или директории. Часто используется перед вызовом unlink() или rmdir().

SplFileInfo::isWritable() - Метод объекта SplFileInfo для проверки возможности записи (и удаления) файла. Работа в объектно-ориентированном стиле.

Типичные ошибки
Отсутствие прав доступа
<?php
// Файл принадлежит другому пользователю или доступ только для чтения
$success = unlink('/etc/config.cfg');
var_dump($success); // false
?>
Warning: unlink(/etc/config.cfg): Permission denied in ...
bool(false)
Блокировка файла другим процессом
<?php
// Файл открыт в другом приложении или скрипте
$fh = fopen('locked.log', 'a');
$deleted = unlink('locked.log');
fclose($fh);
var_dump($deleted);
?>
bool(false)
Передача директории вместо файла
<?php
$result = unlink('my_folder');
var_dump($result);
?>
Warning: unlink(my_folder): Is a directory in ...
bool(false)
Изменения в новых версиях PHP

В PHP 8.0 существенных изменений в поведении функции unlink() не было. Однако, начиная с PHP 7.0, ошибки уровня E_WARNING при сбое операции стали более информативными. В PHP 5.3 и выше улучшена обработка символических ссылок: unlink() удаляет саму ссылку, а не целевой файл.

Расширенные примеры
Удаление файла с использованием контекста потока
Пример php
<?php
$context = stream_context_create(array( /* опции */ ));
$result = unlink('ftp://user:pass@example.com/remote_file.txt', $context);
?>
Рекурсивное удаление всех файлов в директории
Пример php
<?php
function cleanDirectory($dir) {
    $items = array_diff(scandir($dir), array('.', '..'));
    foreach ($items as $item) {
        $path = $dir . DIRECTORY_SEPARATOR . $item;
        if (is_dir($path)) {
            cleanDirectory($path);
            rmdir($path); // Удаляем пустую директорию
        } else {
            unlink($path);
        }
    }
}
cleanDirectory('tmp_cache');
?>
Безопасное удаление с обработкой исключений
Пример php
<?php
try {
    if (!file_exists('important.data')) {
        throw new Exception('Файл для удаления не найден.');
    }
    if (!is_writable('important.data')) {
        throw new Exception('Нет прав на удаление файла.');
    }
    if (!unlink('important.data')) {
        throw new Exception('Неизвестная ошибка при удалении.');
    }
    echo "Операция завершена успешно.";
} catch (Exception $e) {
    echo 'Ошибка: ',  $e->getMessage();
}
?>
Удаление файла по символической ссылке
Пример php
<?php
symlink('/var/www/original.zip', 'link_to_file.zip');
$deleted = unlink('link_to_file.zip'); // Удаляет ссылку, оригинал остается
var_dump($deleted);
echo "Оригинальный файл существует: " . file_exists('/var/www/original.zip');
?>
bool(true)
Оригинальный файл существует: 1
Аналоги в других языках

Unlink в Python

import os
os.remove('file.txt')  # Удаляет файл
# Для рекурсивного удаления директорий: shutil.rmtree('directory')
JavaScript (Node.js)
const fs = require('fs').promises;
async function deleteFile() {
    try {
        await fs.unlink('file.txt');
        console.log('Файл удален');
    } catch (err) {
        console.error('Ошибка:', err);
    }
}
deleteFile();
MySQL (SQL)
-- Удаление строк из таблицы, а не файлов
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;
-- Для работы с файлами используется команда системной оболочки через SELECT ... INTO OUTFILE или LOAD_FILE

Отличия: В PHP unlink() работает на уровне файловой системы. В SQL операции обычно производятся с данными внутри таблиц. Python и Node.js используют похожий синтаксис, но в асинхронном контексте Node.js часто применяются промисы или колбэки.

PHP unlink function comments

En
Unlink Deletes a file