Как удалить файл в PHP? Unlink php — удаление файлов Решение проблемы многопоточности при удалении файлов

Ошибки 

Продолжаем урок, который посвящен теме «Работа с файлами PHP ». Если вы не читали предыдущий , рекомендую почитать, а те, кто читал, двигаемся дальше. В этом уроке вы научитесь удалять созданный или существующий файл с помощью PHP, копировать или переименовывать, блокировать файл.
Ну что, если вы готовы, тогда в бой…

Удаление файла на PHP

Если вам нужно удалить какой-либо файл, воспользуйтесь PHP-функцией unlink() :

Unlink(имя_файла);

Имя_файла – здесь укажите имя файла, который нужно удалить.

Припустим, нам нужно удалить файл «file.txt », пример для заполнения будет вот такой:

Unlink("file.txt");

Готовый код:

Если файл «file.txt » присутствовал, скрипт его удален.

Копирование файла на PHP

Если вам нужно из одного файла перекопировать содержимое в другой файл, воспользуйтесь PHP-функцией copy() .

Copy("файл1", "файл2");

Файл1 – имя файла откуда будет копироваться текст
- файл2 – имя файла куда будет копироваться текст

Для примера создайте на локальном сервере в папке «test-1 » файл под названием «file2.txt ». Пусть файл будет пустым. Теперь вставим этот код copy("file.txt", "file2.txt"); в php код «file.php »:

Что мы сделали? Создали через PHP файл под названием «file.txt », сделали запись в файле «file.txt » через PHP « Я рад видеть вас на блоге сайт », вывели результат в браузере, скопировали текст с файла «file.txt » и вставили в файл «file2.txt ». Не верите, что так все произошло? Вы помните, что файл «file2.txt » был пустым?! Откройте его! И что вы видите? Да, правильно, текст, который был в файле «file.txt »:

Переименование файла на PHP

Чтобы сделать переименование файла, воспользуйтесь PHP-функцией rename() :

Rename("файл1", "файл2");

Файл1 – название файла, которое нужно заменить (переименовать )
- файл2 – здесь нужно дать новое название файла

Пример для заполнения вот такой:

Rename("file2..txt");

Вот готовый код:

Файл «file2.txt » переименован в файл «сайт.txt ».

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

Давайте попробуем решить простую задачу по удалению одного файла или нескольких файлов средствами PHP. В целом, здесь нет ничего сложного, но есть масса деталей, а также вариантов решений, о которых Вам стоит знать. В своей статье я не берусь объять необъятное, но растолковать пару вопросов и привести несколько примеров, думаю, смогу. Приступим?

PHP функция unlink()

А начну я с php-функции unlink() , которая и осуществляет удаление файла:

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

Здесь $filename - путь к файлу, а $context (не обязательно) - описание контекстов для работы с потоками (поддерживается в PHP, начиная с 5.0.0) . Функция возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Пример использования php-функции unlink():

$filename = "./path/to/file.txt";

Почему эта функция называется unlink()?

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

Примечательно здесь и то, что в Unix можно связать несколько таких точек с одними и теми же данными. Таки данные будут существовать до тех пор, пока существует хотя бы одна ссылка на них. Но если все ссылки будут уничтожены, то и сами данные будут уничтожены. Таким образом, функция unlink() предназначена для удаления именно ссылок, и уже как следствия данных файла.

В Windows такого нет и функция unlink() удаляет именно файл. Более того, некоторые версии PHP для Windows вообще не поддерживают unlink() . В таком случае используется команда del через system() или exec() , например:

$filename = "/2014/04/file.txt";
if (isset($_ENV["WINDIR"])) {
@exec("del ". $filename);
if (file_exists($filename)) die("Error Delete File.");
} else if (!(@unlink($filename))) {
die("Error Delete File.");
}

В данном случае переменная среды $_ENV["WINDIR"] может служить маркером использования Windows-платформы, а проверка выполнения удаления файла осуществляется через php-функцию file_exists() , которая осуществляет проверку существования файла.

Как удалить файл(ы) в PHP?

В некоторых случаях может получиться и так, что функция unlink() не будет иметь доступа к удалению файла, т.е. получаем ошибку : permission denied . Это может быть связано с неправильно указанным путём к файлу или отсутствием прав доступа.

Интересным вариантом для работы с путями к файлу является использование php-функций getcwd() (получает имя текущего рабочего каталога) и chdir() (изменяет текущий каталог на указанный) , например:

$file_path = "path/to";
$file_name = "/2014/04/file.txt";
$old = getcwd();
if (!(@chdir($file_path))) die("Error open path.");
if (!(@unlink($file_name))) die("Error Delete File.");
chdir($old);

Как вы видите, так в чём-то проще ориентироваться и отследить проблему. В тоже время, будет не лишним, после выполнения удаления вернуться в текущий каталог $old .

Что же до проблем доступа, то здесь можно попробовать использовать php-функцию chmod() (изменяет режим доступа к файлу) , например:

$filename = "/2014/04/path/to/file.txt";
@chmod($filename, 0666);
if (!(@unlink($filename))) die("Error Delete File.");

Если Вам необходимо удалить все файлы в директории удобно использовать комбинацию из php-функций array_map() (применяет callback-функцию ко всем элементам массива) и glob() (находит файловые пути, совпадающие с шаблоном) , например:

array_map("unlink", glob("some/dir/*.txt"));

Решение проблемы многопоточности при удалении файлов

Гораздо сложнее, когда речь заходит о крупных сайтах, где велико количество одновременных запросов (потоков) к скрипту. Здесь существует ряд решений. Я же приведу лишь одно из них, основное на использовании семафоров .

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

Для получения ресурса семафора используется функция sem_get() . Функцией можно получить семафор со значением, отличающимся от единицы, и тогда захватить семафор смогут несколько потоков. Для захвата используется функция sem_acquire() . Пример:

$sem = sem_get(1);
if (sem_acquire($sem) && file_exists($filename)) @unlink($filename);
sem_remove($sem);

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

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

На этом у меня всё. Надеюсь, что моя статья была Вам полезна или просто познавательно. Спасибо за внимание. Удачи!

в 8:00 Изменить сообщение

PHP - язык программирования, в основном используемый для создания динамических web-страниц. Равно как и любой другой язык программирования, PHP содержит массу возможностей, среди которых очень много полезных. К примеру, возможность удаления файла, которую вы можете использовать в ваших скриптах.

Этот совет поможет вам узнать, как удалить файл в PHP при помощи функции unlink .

Пошаговая инструкция:

Для удаления файла в PHP можно использовать функцию unlink . На примере простого скрипта, разберем работу unlink :

  1. Создайте текстовый файл в текстовом редакторе (vi/vim, nano, gedit или просто в стандартном Блокноте).
  2. Наберите или просто скопируйте в него следующий код: $file="example.log";
    unlink($file);
    ?>
  3. Сохраните (к примеру под именем testunlink.php) и разместите созданный файл скрипта на вашем тестовом web-сервере. В этом же каталоге создайте файл example.log с любым содержимым. Именно его мы и будем удалять.
  4. Запустите скрипт, вызвав его в браузере, и, посмотрев вновь в каталог, вы обнаружите, что файла example.log там больше нет. Unlink сделал свое дело!

Как это все работает:

Первая строка кода скрипта: определяем тип нашего скрипта.

Вторая строка кода: После запуска созданного нами скрипта, переменной file будет присвоено значение example.log (обратите внимание, что файл с одноименным названием должен присутствовать в том же каталоге, что и созданный нами скрипт. Просто создайте его с любым содержимым!).

Третья строка кода: Удаляем файл example.log, передав его в качестве аргумента функции unlink.

Четвертая строка кода скрипта: конец кода php.

Нередко, при создании программы, возникает необходимость удаления файлов (причины могут быть самыми разными) и в этом случае нам на помощь приходит unlink php. Сегодня мы научимся удалять файлы в PHP и рассмотрим несколько примеров.

Удаляем файлы при помощи unlink PHP

Для удаления файлов служит функция unlink() . Синтаксис у этой функции следующий:

unlink (имя_файла)

Данная функция является логической и поэтому в случае успешного удаления файла возвращает TRUE, а в случае неудачи – FALSE. Рассмотрим использование unlink() на примере:

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

Существует несколько путей решения данной проблемы. Например можно использовать более сложную внутреннюю архитектуру программы, использовав условные операторы if . Или достаточно поставить символ @ перед самой функцией для игнорирования возникающих ошибок. В этом случае, даже если файл не будет обнаружен, ошибка не будет инициирована:

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