2013-05-16 69 views
0

爲了增加一個值,我必須編寫一個文件,但有時(當文件連續打開兩次時)它只會增加一個而不是兩個。使用PHP覆蓋文件問題

這部分腳本執行兩次連續:

include "changevar.php";//declare the changevar function 
include $file;//get user's impressions 
changevar("impressions",$impressions+1,$file,1);//increase the impressions by 1 

這是changevar.php文件:

<? 
function changevar($varname,$newval,$filename,$type) 
{ 
    while(!$fp=fopen($filename,"c+")) 
    { 
     usleep(100000); 
    } 
    while(!flock($fp,LOCK_EX)) 
    { 
     usleep(100000); 
    } 
    $contents=fread($fp,filesize($filename)); 
    ftruncate($fp,0); 
    rewind($fp); 
    eval(substr(substr($contents,2),0,-2)); 
    $$varname=$newval; 
    if($type==0)//avoid reading this, in this case $type equals to 1 
    { 
     $u=str_replace("\"","\\\"",$u); 
     $p=str_replace("\"","\\\"",$p); 
     $t=str_replace("\"","\\\"",$t); 
     $d=str_replace("\"","\\\"",$d); 
     $text="<?\$o=$o;\$u=\"$u\";\$c=$c;\$m=$m;\$p=\"$p\";\$C=$C;\$id=\"$id\";\$t=\"$t\";\$d=\"$d\";\$O=$O;?>"; 
    } 
    else//true, $type equals to 1 
    { 
     $text="<?\$impressions=$impressions;\$clickunici=$clickunici;\$clicknulli=$clicknulli;\$creditiguadagnati=$creditiguadagnati;\$creditiacquistati=$creditiacquistati;\$creditiutilizzati=$creditiutilizzati;?>"; 
    } 
    fwrite($fp,$text); 
    fflush($fp); 
    flock($fp,LOCK_UN); 
    fclose($fp); 
} 
?> 

正如我剛纔所說,腳本工作正常,但如果它連續執行兩次。

我認爲問題在於$contents=fread($fp,filesize($filename));,因爲它在寫入文件之前讀取文件。

我已經使用了flock函數,但它不能解決這個問題。

那麼,我該如何修復代碼呢?

+1

您可以在'sys_get_temp_dir()'中創建互斥體,並在最後刪除它。如果它已經存在,請等待隨機時間。 –

+0

爲什麼這樣一個普遍的問題?爲什麼不直接找到並解決讓'flock()'無法正常工作的問題? – alexis

+0

您是否真的需要在單次執行中多次打開/讀取/寫入/關閉文件?你的代碼的穩定性,服務器上的IO負載,腳本的響應能力以及*你的智慧*如果將數據承諾文件移動到腳本文件的末尾,每次執行只發生一次,並且只有在必要時。否則,你可能會更好地使用數據庫來簡化交易的原子性。 – Sammitch

回答

0

不清楚你在做什麼,因爲你只是給你的代碼片斷,而不顯示讀取的文件的內容;但是如果你想增加文件中的值,你應該加一個你從鎖定文件讀取的數字 - 不要寫出從外部傳遞給changevar()的參數($impressions+1)。重新思考你的代碼的邏輯並修復它。