bartwell
@bartwell

Проблема с функцией flock()?

Имеется код:
$fpath='/path/to/file.txt';

if(file_exists($fpath)) {
	echo '1 ('.$uid.')';
	if(($fs=filesize($fpath))>0) {
		echo '2 ('.$uid.')';
		$fp=fopen($fpath,'r+');
		if($fp) {
			echo '3 ('.$uid.')';
			if(flock($fp,LOCK_EX|LOCK_NB)) {
				echo '4 ('.$uid.')';
				$fdata=fread($fp,$fs);
				ftruncate($fp,0);
				flock($fp, LOCK_UN);
				fclose($fp);
				
				if(!empty($fdata)) {
					echo '5 ('.$uid.')';
					//дальнейшая обработка данных
				}

			}
		}
	}
}

if(file_exists($fpath) && filesize($fpath)===0) {
	echo '6 ('.$uid.')';
	unlink($fpath);
}



Суть его проста: один раз обработать данные из файла и удалить его. Для этого читаем и очищаем файл. А как только его размер стал равен нулю — удаляем.


В 99,9% срабатывания скрипта все работает как надо. Однако иногда возникает проблема: обработка не происходит, а файл удаляется. По меткам выглядит это так:


Пример 1.
1 (94843)
1 (116664)
1 (98269)
2 (98269)
3 (98269)
2 (94843)
3 (94843)
6 (116664)
1 (106588)
1 (129934)
2 (129934)
3 (129934)
2 (106588)



Пример 2.
1 (122676)
1 (130335)
2 (122676)
1 (115320)
3 (122676)
1 (94538)
6 (130335)
2 (115320)



Т.е., не срабатывает flock(), но размер файла при этом становится равном нулю (или что-то заставляет filesize() так думать). Из-за чего может такое возникать?


P.S. Никаких ошибок и предупреждений в логах по этому коду не выводится.
  • Вопрос задан
  • 3534 просмотра
Пригласить эксперта
Ответы на вопрос 2
@edogs
Попробуйте
а) Фклозить файл даже в случае если флок не удался (сейчас у Вас fclose только внутри блока с успешным flock-ом, это не вполне корректно).
б) clearstatcache перед вторым файлсайзом.

p.s.: Если php запущен как cgi, то на блокировку полагаться нельзя.
Ответ написан
Arks
@Arks
У меня не работал flock на Windows(юзалась версия XAMPP которая с php 5.4), вообще никак. Работа flock заявлена как may be в зависимости от ОС(я там понимаю и ФС)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы