鍍金池/ 問答/PHP/ PHP并發(fā)讀寫文件問題 高手請進!

PHP并發(fā)讀寫文件問題 高手請進!

ajax1.html三個ajax方法同時訪問ajax1.php,ajax1.php中有進行文件data.php讀寫,由于三個ajax方法訪問頻率特別高,就產生了并發(fā)訪問,導致讀寫出錯,使用了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代碼(以下數(shù)據(jù)是出錯了的數(shù)據(jù)):

return array (
  0 => 'b-3',
);1 => 'a-1',
  2 => 'c-1',
  3 => 'b-2',
  4 => 'a-2',
  5 => 'c-2',
);
回答
編輯回答
傲寒

不要寫在同一個文件..$fileName=date('is').mt_rand(0,999);$file = fopen($fileName, 'w');寫完就把文件unlink

2018年5月2日 01:07
編輯回答
尐潴豬

你缺乏網絡知識和系統(tǒng)知識。
不要作文件IO,用數(shù)據(jù)庫,或者其它對象存儲的基礎設施。

2018年8月15日 03:23
編輯回答
離殤

如果數(shù)據(jù)庫和Nosql都不用,那么針對文件并發(fā)讀寫時:

1、在寫之前生成個副本,做讀取

2、并發(fā)寫時,文件頻繁加鎖效率會降低。我覺得可以,在寫時先創(chuàng)建個臨時文件,最后再進行文件合并(這個有難度,什么時間合并?怎么合并?),合并后再生成一個用于讀的副本,這樣速度會提高很多

2018年8月12日 16:22
編輯回答
做不到

帶“鎖”,且并發(fā)量大的操作都不建議直接對相關業(yè)務進行操作;

可以先寫入到nosql層,在由服務器異步(如定時等),慢慢同步對應文件DB


補充內容


數(shù)據(jù)統(tǒng)計

如圖是一個前陣子做的一個數(shù)據(jù)統(tǒng)計的方案(主要是參考流程)

對于web端,只有redis操作;無任何其他影響性能(如mysql,及類似你的文件)的操作。
web端包含相關的業(yè)務去重;收集匯總

服務器異步:將web端匯總收集的數(shù)據(jù)進行DB入庫


性能:日請求量:3303萬(用數(shù)據(jù)說話)

2018年9月3日 13:30