使用PHP覆盖文件问题


Overwriting file issue using 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,这是您从锁定的文件中读取的数字—而不是写入从外部传递给changevar()的参数($impressions+1)。重新思考代码的逻辑并修复它。