1000 записей (приложений) в один файл с помощью SplFileObject
Файл "receive.php" получает ±1000 Ajax-запросов в секунду с $array
данные, которые записываются с помощью следующего кода в файл.csv:
$file = new SplFileObject( __DIR__ . 'file.csv', 'a' );
$file->fputcsv( $array, "|", "'" );
$file = null;
Вопросы:
Будут ли данные каждого запроса правильно добавлены в файл.csv? Или, если некоторые из запросов совпадут в момент записи, данные этих запросов будут потеряны из-за "блокировки файлов"?
Что произойдет, если в то же время, когда эти 1000 запросов в секунду записывают в файл file.csv - другой процесс, инициированный службой cron, включится и начнет читать этот файл.csv? Будут ли эти 1000 запросов продолжать добавлять данные в file.csv или в течение времени, пока процесс cron будет работать с file.csv - эти 1000 запросов будут " ударяться о стену", и данные не будут вставлены, потеряны?
В целом - мне просто интересно, могут ли быть потери данных в таких случаях или нет?
1 ответ
Php не блокирует файл по умолчанию [если я не ошибаюсь], вы можете заблокировать файл с помощью функции php flock ().
Блокировка файла заставит процесс ждать, пока каждая блокировка будет "снята", прежде чем начать другую операцию над ней.
Однако существует проблема, если время ожидания http-запроса истекает до снятия блокировки файла. Но вы можете предотвратить это, установив следующие конфиги envirement.
set_time_limit(0); //sets timeout for runnin the script to unlimited.
ignore_user_abort(); //prevents user from aborting the request once started
Однако 1000+ запросов в секунду кажется, что этот подход приближается к своей жизнеспособности. И я бы предложил использовать систему очередей для входящих данных и отделить обновление файла от входящих запросов.