Имеется код:
$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. Никаких ошибок и предупреждений в логах по этому коду не выводится.