@maxxxixxxx

С чем может связано странное поведение скрипта?

У меня все хранится по файлам.
Данные представляют собой массив.
В файл сохраняются с помощью serialize() вот так:

if(is_file($file_path.'.txt')) {
            $fp = fopen($file_path.'.txt', "a+");
                flock($fp, LOCK_EX);
                
                    $data_str = fread($fp, filesize($file_path.'.txt'));
                    $counter_arr = unserialize($data_str);
                    
                    $counter_arr_new = $this->process($counter_arr);
                    $data_str_new = serialize($counter_arr_new);
                    
                    ftruncate($fp, 0);
                    fwrite($fp, $data_str_new);
                    fflush($fp);
                    
                flock($fp, LOCK_UN);
            fclose($fp);
            
        }
        else {
            
            $fp = fopen($file_path.'.txt', "a+");
                flock($fp, LOCK_EX);
                    
                    $counter_arr_new = $this->process(array());
                    $data_str_new = serialize($counter_arr_new);
                    
                    ftruncate($fp, 0);
                    fwrite($fp, $data_str_new);
                    fflush($fp);
                    
                flock($fp, LOCK_UN);
            fclose($fp);
            
        }


В коде $this->process() есть только одна проверка
if(count($arr)>100) {
     unset($arr[0]);
     $arr = array_values($arr);
}


И вот значит захожу я в файл и вижу что в нем 2 значения, а было то 100.

Как так получилось что файл каким то образом стерся или стерся массив?

Размер файла примерно 25 мб, файлов одновременно может открываться несколько.
Как бы вроде как гдето в пхп есть ограничение на оперативную память и вполне возможно что открылось несколько файлов одновременно и память закончилась, но это все размышления, а нужна конкретика.
  • Вопрос задан
  • 2322 просмотра
Пригласить эксперта
Ответы на вопрос 2
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Перед записью данных в файле проверяйте их на валидность/вменяемость.
Может быть есть ошибка в $this->process()
Ответ написан
Комментировать
Karponter
@Karponter
echo "input dump --- \n";
var_dump($counter_arr);
echo "output dump --- \n";
var_dump($this->process($counter_arr));

Выполните для входного файла после считывания и увидите что именно считалось с входного файла и что должно записаться обратно после обработки. Сравните с исходником и результатом в файле. Таким образом легко выявите в какой области ошибка: считывание, обработка или запись.
var_dump($this->process($counter_arr));
Если этот код выдаст злополучные два значения вместо ста - ошибка в обработке.
Ответ написан
Ваш ответ на вопрос

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

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