1

“receiver.php”文件每秒接收 ±1000 个 Ajax 发布请求,$array其中包含使用以下代码写入file.csv的数据:

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

问题:

  1. 每个请求数据是否会正确附加到 file.csv?或者如果某些请求在写入时刻同时发生,那么这些请求数据会因为“文件锁定”而丢失?

  2. 如果每秒 1000 个请求同时写入 file.csv 会发生什么 - 由 cron 服务启动的其他进程将介入并开始读取该file.csv?这 1000 个请求是否能够继续将数据附加到file.csv或在 cron 进程将与file.csv一起工作的时候- 这 1000 个请求将“撞墙”并且数据不会被插入、丢失?

总的来说-我只是对在这种情况下是否会丢失数据感兴趣?

4

1 回答 1

2

默认情况下,php 不锁定文件 [如果我没记错的话] 你可以使用phpflock()函数锁定文件。

关于羊群()的文档

文件锁定将使进程等待每个锁被“释放”,然后再开始对其进行另一个操作。

但是,如果 http 请求在文件锁定释放之前超时,则会出现问题。但是您可以通过设置以下环境配置来防止这种情况发生。

 set_time_limit(0); //sets timeout for runnin the script to unlimited.
 ignore_user_abort(); //prevents user from aborting the request once started

然而,每秒 1000 多个请求似乎这种方法已接近可行。我建议对传入的数据使用排队系统,并将文件的更新与传入的请求分离。

于 2018-10-19T22:17:07.360 回答