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

  • Автор темы Автор темы Sparton
  • Дата начала Дата начала

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 не удаляется, в чем может быть проблема? Может одновременное чтение удаление файла?
 
При первом просмотре её на сайте - создается xml файл, в качестве кеша, откуда потом и берется текст новости.
мож так?
 
Андрейка
В смысле?

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

повторяю вопрос. а как ты проверяешь, что файл не удалился? unlink то у тебя всегда говорит ОК?
 
Да, unlink сообщает что выполнено успешно. Вот только что опять смотрел, есть изменения для новости, внесены в БД, а файл не обновился. В логах пишет, что выполнил...
Может как-то блокировать файл перед удалением?
 
при применении unlink не совсем удаляет файл, она удаляет имя из таблицы, так что если кто то еще читает, то связан уже не по имени.
телепатически думаю так, сначала пиши в временный, потом удаляй, rename. Либо lock с другими проблемами.
 
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);


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