在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/PHP/ PHP并發(fā)讀寫(xiě)文件問(wèn)題 高手請(qǐng)進(jìn)!

PHP并發(fā)讀寫(xiě)文件問(wèn)題 高手請(qǐng)進(jìn)!

ajax1.html三個(gè)ajax方法同時(shí)訪問(wèn)ajax1.php,ajax1.php中有進(jìn)行文件data.php讀寫(xiě),由于三個(gè)ajax方法訪問(wèn)頻率特別高,就產(chǎn)生了并發(fā)訪問(wèn),導(dǎo)致讀寫(xiě)出錯(cuò),使用了flock()還是會(huì)出錯(cuò),請(qǐng)高手們指導(dǎo)一下怎么解決呢?

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ù)是出錯(cuò)了的數(shù)據(jù)):

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

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

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

你缺乏網(wǎng)絡(luò)知識(shí)和系統(tǒng)知識(shí)。
不要作文件IO,用數(shù)據(jù)庫(kù),或者其它對(duì)象存儲(chǔ)的基礎(chǔ)設(shè)施。

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

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

1、在寫(xiě)之前生成個(gè)副本,做讀取

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

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

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

可以先寫(xiě)入到nosql層,在由服務(wù)器異步(如定時(shí)等),慢慢同步對(duì)應(yīng)文件DB


補(bǔ)充內(nèi)容


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

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

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

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


性能:日請(qǐng)求量:3303萬(wàn)(用數(shù)據(jù)說(shuō)話)

2018年9月3日 13:30