«Receiver.php» файл получает ± 1000 Ajax-запросов в секунду с $array
данные, которые записаны с помощью следующего кода в file.csv:
$file = new SplFileObject( __DIR__ . 'file.csv', 'a' );
$file->fputcsv( $array, "|", "'" );
$file = null;
Вопросы:
Будут ли данные каждого запроса правильно добавлены в файл .csv? Или, если некоторые запросы совпадут в момент записи, данные этих запросов будут потеряны из-за «блокировки файлов»?
Что произойдет, если в то же время, когда эти 1000 запросов в секунду записывают в файл file.csv — другой процесс, инициированный службой cron, включится и начнет читать file.csv? Будут ли эти 1000 запросов продолжать добавлять данные в file.csv или пока процесс cron будет работать с file.csv — эти 1000 запросов будут «врезаться в стену» и данные не будут вставлены, потеряны?
В целом — мне просто интересно, могут ли быть потери данных в таких случаях или нет?
Php не блокирует файл по умолчанию [если я не ошибаюсь] вы можете заблокировать файл с помощью php стадо() функция.
Блокировка файла заставит процесс ждать, пока каждая блокировка будет «снята», прежде чем начать другую операцию над ней.
Однако существует проблема, если время 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+ запросов в секунду кажется, что этот подход приближается к своей жизнеспособности. И я бы предложил использовать систему очередей для входящих данных и отделить обновление файла от входящих запросов.
Других решений пока нет …