1000 записей (приложений) в один файл с помощью SplFileObject - PullRequest
0 голосов
/ 20 октября 2018

"receive.php" файл получает ± 1000 Ajax-запросов в секунду с $array данными, которые записываются с помощью следующего кода в file.csv :

$file = new SplFileObject( __DIR__ . 'file.csv', 'a' );
$file->fputcsv( $array, "|", "'" );
$file = null;

Вопросы:

  1. Будут ли данные каждого запроса правильно добавлены в файл .csv?Или, если некоторые из запросов совпадут в момент записи, данные этих запросов будут потеряны из-за «блокировки файлов»?

  2. Что произойдет, если одновременно с этими 1000 запросами в секундупишет в file.csv - другой процесс, инициированный службой cron, вступит в действие и начнет читать, что file.csv ?Будут ли эти 1000 запросов продолжать добавлять данные в file.csv или в течение времени, пока процесс cron будет работать с file.csv - эти 1000 запросов будут "поражать стену""и данные не будут вставлены, потеряны?

В целом - мне просто интересно, могут ли быть потери данных в таких случаях или нет?

1 Ответ

0 голосов
/ 20 октября 2018

Php не блокирует файл по умолчанию [если я не ошибаюсь], вы можете заблокировать файл с помощью функции php flock () .

документы на 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+ запросов в секунду, однако кажется, что этот подход приближается к своей жизнеспособности.И я бы предложил использовать систему очередей для входящих данных и отделить обновление файла от входящих запросов.

...