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
函數,但它不能解決這個問題。
那麼,我該如何修復代碼呢?
您可以在'sys_get_temp_dir()'中創建互斥體,並在最後刪除它。如果它已經存在,請等待隨機時間。 –
爲什麼這樣一個普遍的問題?爲什麼不直接找到並解決讓'flock()'無法正常工作的問題? – alexis
您是否真的需要在單次執行中多次打開/讀取/寫入/關閉文件?你的代碼的穩定性,服務器上的IO負載,腳本的響應能力以及*你的智慧*如果將數據承諾文件移動到腳本文件的末尾,每次執行只發生一次,並且只有在必要時。否則,你可能會更好地使用數據庫來簡化交易的原子性。 – Sammitch