unlink - почему может не срабатывать?

Sparton

Новичок
unlink - почему может не срабатывать?

Новости хранятся в БД. При первом просмотре её на сайте - создается xml файл, в качестве кеша, откуда потом и берется текст новости. При правке и сохранении новости в админке выполняется unlink файла xml с данной новостью, чтобы создался новый. Так вот проблема в том, что файл не всегда стирается. Примерно 1 раз из 10 файл не стирается. Написал вот такую функцию
PHP:
function delete_file($name,$i=0){
$max_try=5; //макс число попыток
//echo $i;
if (is_file($name)) {
	$rez = unlink($name);
	//echo "->".$rez."<-";

	$fp=fopen($_SERVER['DOCUMENT_ROOT']."info/log/log_error.txt", "a+");
	fwrite($fp, $name." - ".$i." - ".$rez."\n");
	fclose($fp);

	if ($rez or $i == $max_try)  return true;
		else { sleep(1); $i++; delete_file($name,$i); }
                     }
                     else return true;
}
Выполняется 5 попыток стирания файла в случае неудачи.
Так вот в log_error.txt всегда пишет, что unlink выполнен удачно, возвращает единицу.

В админке сначала обновляется инфа в БД, затем выполняется эта функция.

Так вот порой файл xml не удаляется, в чем может быть проблема? Может одновременное чтение удаление файла?
 

Андрейка

Senior pomidor developer
При первом просмотре её на сайте - создается xml файл, в качестве кеша, откуда потом и берется текст новости.
мож так?
 

Sparton

Новичок
Андрейка
В смысле?

Beavis
До этого было так, как говоришь, но были те же глюки порою...
 

dimagolov

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

Sparton

Новичок
Автор оригинала: dimagolov
а как ты проверяешь, что файл не удалился?
вообще это от файловой системы зависит как реагировать на удаления файла к которому есть доступ. есть разные подходы...
unlink возвращает true, или единицу, её пишу в лог. На сервере freeBSD стоит, у неё есть какие-то особенности?
 

dimagolov

Новичок
я не большой спец, чисто из опыта, но на 6-й BSD есть файловая система, которая удаляет даже открытый сейчас файл. для всех, кроме того процесса, который работает с файлом, файл он уже не виден, но процесс нормально читает/пишет в него. для этого процесса файл (по крайней мере хендлер) умрет после его закрытия.

повторяю вопрос. а как ты проверяешь, что файл не удалился? unlink то у тебя всегда говорит ОК?
 

Sparton

Новичок
Да, unlink сообщает что выполнено успешно. Вот только что опять смотрел, есть изменения для новости, внесены в БД, а файл не обновился. В логах пишет, что выполнил...
Может как-то блокировать файл перед удалением?
 

ustas

Элекомист №1
при применении unlink не совсем удаляет файл, она удаляет имя из таблицы, так что если кто то еще читает, то связан уже не по имени.
телепатически думаю так, сначала пиши в временный, потом удаляй, rename. Либо lock с другими проблемами.
 

ustas

Элекомист №1
if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) {
// On platforms and filesystems that cannot overwrite with rename()
// delete the file before renaming it -- because windows always suffers
// this, it is short-circuited to avoid the initial rename() attempt
@unlink($params['filename']);
@rename($_tmp_file, $params['filename']);
}
@chmod($params['filename'], $smarty->_file_perms);


(с)смарти ? работает у всех, изучай чужие исходники, особенно публичные.
 

boombick

boombick.org
Что же это все-таки значит? не нашел...
Это значит: возьми исходники любого публичного продукта, который в процессе работы удаляет файл и посмотри, как это реализовано там.
 

gray07

Новичок
По идее файл должен удалятся без разных rename.
Может ты сначала его удаляешь, а потом сохраняешь в БД (или же потом закрываешь транзакцию)? И до того, как сохранил, другой процесс успевает создать его заново?
 
Сверху