PHP并发读写文件问题 高手请进!

ajax1.html三个ajax方法同时访问ajax1.php,ajax1.php中有进行文件data.php读写,由于三个ajax方法访问频率特别高,就产生了并发访问,导致读写出错,使用了flock()还是会出错,请高手们指导一下怎么解决呢?

ajax1.html代码:

var a = 1;
var b = 1;
var c = 1;
function ajax1(){
    $.get('ajax1.php?from=a&value='+a, function(res){
        $('#ajax1').text(a);
        a++;
        if(res == 1){
            ajax1();
        }
    });
}
function ajax2(){
    $.get('ajax1.php?from=b&value='+b, function(res){
        $('#ajax2').text(b);
        b++;
        if(res == 1){
            ajax2();
        }
    });
}
function ajax3(){
    $.get('ajax1.php?from=c&value='+c, function(res){
        $('#ajax3').text(c);
        c++;
        if(res == 1){
            ajax3();
        }
        
    });
}

function beginAjax(){
    ajax1();
    ajax2();
    ajax3();
}

ajax1.php代码:

$from = $_GET['from'];
$value = $_GET['value'];

$data = is_array(include 'data.php')? include 'data.php': array();

$data[] = $from .'-'. $value;

$file = fopen('data.php', 'w');
$lock = flock($file, LOCK_EX);
if($lock){
    fwrite($file, '<?php');
    fwrite($file, PHP_EOL);
    fwrite($file, 'return ');
    fwrite($file, var_export($data, true));
    fwrite($file, ';');
    flock($file, LOCK_UN);
}
fclose($file);
exit('1');

data.php代码(以下数据是出错了的数据):

return array (
  0 => 'b-3',
);1 => 'a-1',
  2 => 'c-1',
  3 => 'b-2',
  4 => 'a-2',
  5 => 'c-2',
);
呼啦一阵风
浏览 388回答 4
4回答

慕村9548890

如果数据库和Nosql都不用,那么针对文件并发读写时: 1、在写之前生成个副本,做读取 2、并发写时,文件频繁加锁效率会降低。我觉得可以,在写时先创建个临时文件,最后再进行文件合并(这个有难度,什么时间合并?怎么合并?),合并后再生成一个用于读的副本,这样速度会提高很多

阿波罗的战车

你缺乏网络知识和系统知识。不要作文件IO,用数据库,或者其它对象存储的基础设施。
打开App,查看更多内容
随时随地看视频慕课网APP