1000 записей (приложений) в один файл с помощью SplFileObject

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

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

Вопросы:

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

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

Другие вопросы по тегам