Php unlink не удаляет файл
Я пытался понять, почему unlink не работает. Я пробовал stackoverflow предыдущие вопросы и ответы, но безуспешно. Точное имя файла, которое должно быть удалено, - 'upload/test.jpg' . Сначала я проверил, существует ли файл.
3 ответа
У меня есть config.php, я сделал ls-l на этом файле, который показывает-rwxrwxr-x чтение, запись и исполняемый файл. но в скрипте PHP функция is_writable (config.php)function показывает, что файл не доступен для записи. почему это?
Я хочу удалить с помощью php (unlink function) файл, который находится вне webroot. мой веб-корень находится внутри C:\server\webroot\project\. in webroot I have folder named project and in there I have .php files. что касается каталога файлов. он расположен C:\server\mp3_files. Также я создал.
Вместо этого дайте полный путь, например
Тогда попробуйте это,
Если вы говорите, что все в порядке и нет проблем с разрешениями, то вы тоже можете попробовать этот способ:
Попробуйте это и опубликуйте, какие результаты вы получите (если таковые имеются).
Похожие вопросы:
Чтобы быть кратким; php unlink работает с файлами, если их имя asci. Однако unlink производит ошибку file not found, если я пытаюсь удалить файл с именем, включающим ç ö и т. д. Есть ли какой-нибудь.
Как удалить файл с моего сервера с помощью PHP, если файл находится в другом каталоге? Вот мой макет страницы: projects/backend/removeProjectData.php (этот файл удаляет все мои записи для базы.
Я ищу решение, которое мне нужно, чтобы удалить файлы журналов, но может быть вероятность того, что они доступны в момент выполнения вызова delete. Под доступом я подразумеваю, что процесс либо.
У меня есть config.php, я сделал ls-l на этом файле, который показывает-rwxrwxr-x чтение, запись и исполняемый файл. но в скрипте PHP функция is_writable (config.php)function показывает, что файл не.
Я хочу удалить с помощью php (unlink function) файл, который находится вне webroot. мой веб-корень находится внутри C:\server\webroot\project\. in webroot I have folder named project and in there.
Я пытаюсь проверить, существует ли файл, и если да, то удалить его. По какой-то странной причине проверка файла возвращает true, но он не разблокируется ни за что на свете. Вот код, который у меня.
У меня есть процесс PHP, который: начинается как корень записывает и затем закрывает PID-файл в /var/run/ chown() с указанным PID-файл, чтобы другой пользователь изменения для этого пользователя.
У меня есть сайт обмена изображениями, и недавно я заметил, что не могу удалить некоторые из моих изображений с помощью скрипта. Мой файл доступен для записи и существует (так что это не проблема с.
Я хочу знать, как проверить, существует ли данный путь к каталогу, и мне нужно проверить следующее. 1) каталог читаем ? 2) каталог доступен для записи ? 3) Если файл доступен для записи, создайте в.
Давайте попробуем решить простую задачу по удалению одного файла или нескольких файлов средствами 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';
if ( !(@unlink($filename)) ) die('Error Delete File.');
Почему эта функция называется 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() не будет иметь доступа к удалению файла, т.е. получаем ошибку [function.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() (находит файловые пути, совпадающие с шаблоном) , например:
Решение проблемы многопоточности при удалении файлов
Гораздо сложнее, когда речь заходит о крупных сайтах, где велико количество одновременных запросов (потоков) к скрипту. Здесь существует ряд решений. Я же приведу лишь одно из них, основное на использовании семафоров.
Как таковой, семафор служит своеобразным маркером процесса. При захвате семафора одним процессом, его значение уменьшается на единицу, а при отпускании — увеличивается на единицу. При этом, если текущее значение семафора равно нулю, процессу не удастся его захватить и он будет ожидать освобождения семафора.
Для получения ресурса семафора используется функция sem_get() . Функцией можно получить семафор со значением, отличающимся от единицы, и тогда захватить семафор смогут несколько потоков. Для захвата используется функция sem_acquire() . Пример:
$sem = sem_get(1);
if ( sem_acquire($sem) && file_exists($filename) ) @unlink($filename);
sem_remove($sem);
Обратить внимание на то, что здесь используется дополнительная проверка на существование файла file_exists() . Дело в том, что когда первый поток захватит семафор, удалит файл и отпустит семафор, второй поток сможет продолжить выполнение без удаления файл, которого уже нет.
Важную роль здесь играет функция sem_remove() , которая отпускает занятый семафора. Если семафор не отпустить, то параллельный поток останется в состоянии ожидания вплоть до окончания работы текущего. Поэтому функция и должна быть вне условия.
На этом у меня всё. Надеюсь, что моя статья была Вам полезна или просто познавательно. Спасибо за внимание. Удачи!
Можно ли заменить работу с фалом и работу в базе данных.
Например записать в базу данных, стереть в базе данных -> конечно можно, но как по мне, легче, для меня лично, записать в файл, потом удалить файл!
Функция которая удаляет файлы php -> unlink (синтаксис)
Функция, которая умеет удалять файлы в php называется unlinkКак переводится unlink
Слово unlink переводится как - разъединять, отсоединить - довольно странно, поскольку эти слова только отдаленно напоминают удаление. файла!Синтаксис unlink
Функция unlink, имеет два параметра -
Путь к файлу - filename Context -Замечание: Поддержка контекста была добавлена в PHP 5.0.0.
Возвращает TRUE в случае успешного завершения или FALSE.
Если файл лежит в той же папке, что и скрипт с функцией, то запись в скрипте может быть такая:
unlink("test.html"); Лучше всего использовать путь до файла на сервере ! Он всегда одинаковый!
И. И как-то мы делали стенд по удалению файла
Там по кнопке можно создать файл, а оптом удалить файл по нажатию на кнопку.
Самый простой скрипт удаления файла
Для того, чтобы удалить файл вам понадобится несколько компонентов :Нам потребуется путь до корневой на сревре:
Еще нам потребуется путь_до_папки для удаления файла
И собственно файл, который будем удалять с помощью php
Соберем строку полностью по удалению файла и присвоим результат переменной:
И в результате, возврата, вернет либо true, либо false выводим результат удаления файла с помощью unlink
Соберем вместе наш код удаления файла php :Код самого простого скрипта удаления файла php
Удаление файла по его адресу
Следующий скрипт удаления файла по его адресу не очень большой в смысле строк, но довольно большой в смысле, если описывать каждую строчку! Как было это сделано в третьем пункте!Поэтому! -> только логика и немного описания.
В первое поле нужно вставить ссылку на файл на сайте, который хотим удалить!
И далее нажать "Удалить файл"
Как проверить работоспособность скрипта по удалению файла php!?
Скачиваем архив со скриптом по удалению файла php на сайте.
Нужно вытащить страницу из архива, и закачать в какую-то папку на сайте.
Создаем какую-то тестовую страницу, которую будем удалять, в любом месте на сайте.
Открываем её в браузере.
Копируем из адресной строки браузера адрес страницы.
Открываем страницу со скриптом по удалению файла также в браузере и вставляем в строку ввода -> ваш ранее скопированную строку тестовой страницы! И нажимаем удалить файл!
Удаление файла по выделенной радиоточке
Прежде чем начать опять очень долго объяснять каждую строчку в скрипте, но вкратце все же:
У нас есть рабочий пример, о котором дальше и пойдет речь, правда удаление отключено, а то вы мне тут поудаляйте весь сайт
Я не сижу и не выдумываю, какой же скрипт написать, большинство скриптов - это так или иначе были сделаны на основе или целиком на тех скриптах, которые я сам использую!
Предположим, что у вас есть какой-то список с файлами и вам нужно, чтобы была радиоточка напротив ссылки на файл -> далее, отметить радиоточку , нажать -> удалить файл -> файл удален. Это очень удобно.
Я не знаю, как у вас будет формироваться данный список -> это ваше дело, но у нас этот список формируется автоматически.
Мы взяли сформированную ссылку на файл и поместили в input с радиоточкой в value :
далее в цикле перебрали массив, который получился от функции scandir и к каждой строке с ссылкой добавляем этот инпут и у нас получается вот такое -> пример
После этого, выбираем тот файл, который требуется удалить, нажав по радиоточке и нажимаем удалить!
И собственно, скрипт, что и в пункте 4, который и удалит выделенный файл и отправленный через радиоточку value
В предыдущей статье мы с Вами разбирали функции для работы с каталогами в PHP, и там я познакомил Вас с функцией rmdir(), которая удаляет каталог. Однако, я сказал, что таким способом получится удалить только пустую директорию, а вот как удалить каталог с файлами, Вы узнаете сейчас.
Принцип очень простой: чтобы удалить каталог с файлами, надо удалить сначала все файлы, а также все подкаталоги. Внутри подкаталогов могут быть также файлы и другие подкаталоги, их также надо очистить. В общем, сложность состоит в том, что глубина каталогов может быть очень большой. И очевидно, что напрашивается рекурсия - вызов функции внутри самой себя.
Несмотря на кажущуюся сложность алгоритма, реализация очень простая и прозрачная:
<?php
function removeDirectory($dir) if ($objs = glob($dir."/*")) foreach($objs as $obj) is_dir($obj) ? removeDirectory($obj) : unlink($obj);
>
>
rmdir($dir);
>
?>
Постараюсь объяснить понятным языком алгоритм работы данной функции. Первым делом мы получаем список всех файлов внутри заданной директории. Если их там нет, то сразу удаляем её. Если они есть, то начинаем по-очереди перебирать. Если элемент является файлом, то просто удаляем его (unlink($obj)). Если же это каталог, то вызываем вновь нашу функцию, передав этот каталог. Это и есть рекурсия: функция вызывает сама себя. После вызова функцией самой себя всё начинается заново, но уже с другой директорией. У ней также удаляются все файлы, а все её директории отправляются вновь в эту функцию. Когда все директории и файлы удалены, у нас удаляется уже пустой каталог.
Я Вам скажу так, данный алгоритм не столько полезен с точки зрения практики (не так часто приходится удалять каталоги с файлами в PHP), сколько полезен для развития Вашего мышления. Это очень простой алгоритм и решает он весьма и весьма сложную задачу. Поэтому учитесь составлять алгоритмы - это самое главное в любом языке программирования.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 8 ):
Михаил подскажите как удалить в папке несколько файлов png. Я пол дня провел над этой задачей. Прошу подсказать ))) Очень нужно.
Получаете список файлов из каталога и удаляете их в цикле через unlink().
Михаил, читаю ваши уроки с самого начала и не смог обнаружить у вас пояснения двух знаков, и их применение - ? : ; Например тут is_dir($obj) ? removeDirectory($obj) : unlink($obj); И что такое is_dir()?
Подобная запись является аналогом цикла if и оформляется по такой форме: Условие ? Выражение1 : Выражение2 Выражение1 выполнится если Условие истино, Выражение2 если ложно, т.е. else. Например: $x>=$y ? echo("Икс больше либо равен игрику") : echo(Икс меньше игрика); равносильно if($x>=$y) < echo("Икс больше либо равен игрику"); >else
Читайте также: