【问题标题】:1000 writes (appendings) to single file with SplFileObject使用 SplFileObject 对单个文件进行 1000 次写入(附加)
【发布时间】:2019-03-24 19:36:02
【问题描述】:

"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 个请求将“命中”一堵墙”,数据不会插入,会丢失吗?

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

【问题讨论】:

    标签: php performance file csv splfileobject


    【解决方案1】:

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

    docs on flock()

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

    但是,如果在文件锁定释放之前 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 多个请求似乎这种方法已接近可行。我建议对传入数据使用排队系统,并将文件的更新与传入的请求分离。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多