“ receiver.php” 文件每秒接收±1000个Ajax发布请求,其中包含$array
数据,该数据通过以下代码写入 file.csv :
$file = new SplFileObject( __DIR__ . 'file.csv', 'a' );
$file->fputcsv( $array, "|", "'" );
$file = null;
问题:
将每个请求数据正确附加到file.csv吗?或者,如果某些请求在写入时会重合,那么这些请求数据是否会因为“文件锁定”而丢失?
如果每秒每秒有1000个请求正在写入file.csv时会发生什么-由cron服务启动的其他进程将介入并开始读取 file.csv ?是那1000个能够继续将数据追加到 file.csv 的请求,还是在cron进程将与 file.csv 一起工作的时间内-这1000个请求将“被击中”一堵墙”,数据将不会插入,丢失?
总体而言-我只是想知道在这种情况下是否会丢失数据?
答案 0 :(得分:2)
默认情况下,Php不会锁定文件[如果我没记错的话]您可以使用php 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个以上的请求似乎已接近其可行性。我建议对传入的数据使用查询系统,并使文件的更新与传入的请求脱钩。