php 并发 读写文件冲突的解决方案
解决方案核心思想:
增加 临时写入文件数目,对众多临时文件文件进行随机读写,以降低并发的可能性。
实例:
在对用户访问日志进行记录时,这种方案似乎被采用的比较多。
先前需要定义一个随机空间,空间越大,并发的的可能性就越小,这里假设随机读写空间为[1-500],那么我们的日志文件的分布就为log1~到log500不等。每一次用户访问,都将数据随机写到log1~log500之间的任一文件。在同一时刻,有2个进程进行记录日志,A进程可能是更新的log32文件,而B进程呢?则此时更新的可能就为log399.要知道,如果要让B进程也操作log32,概率基本上为1/500,差不多约等于零。在需要对访问日志进行分析时,这里我们只需要先将这些日志合并,再进行分析即可。使用这种方案来记录日志的一个好处时,进程操作排队的可能性比较小,可以使进程很迅速的完成每一次操作。
php代码实例:
<?php
error_reporting(E_ALL || ~E_NOTICE);//报错屏蔽设置
date_default_timezone_set('PRC');//设置默认时区
$randam1 = rand(1,10);
$randam2 = rand(1,10);
$file1 = "spark_sql_data"."_".$randam1.".json";
$file2 = "spark_sql_tanzhen"."_".$randam2.".json";
$fp1 = fopen($file1,"a+");
$fp2 = fopen($file2,"a+");
//..........
//中间逻辑代码
//..........
flock($fp1,LOCK_EX);
fwrite($fp1,$detail_infor_json);
flock($fp1,LOCK_UN);
flock($fp2,LOCK_EX);
fwrite($fp2,$tanzhen_infor_json);
flock($fp2,LOCK_UN);
fclose($file1);
fclose($file2);
?>
结果展示:
完整代码展示(高端玩家选读):
<?php
error_reporting(E_ALL || ~E_NOTICE);//报错屏蔽设置
date_default_timezone_set('PRC');//设置默认时区
$randam1 = rand(1,10);
$randam2 = rand(1,10);
$file1 = "spark_sql_data"."_".$randam1.".json"