【问题标题】:Overwriting file issue using PHP使用 PHP 覆盖文件问题
【发布时间】:2013-05-11 21:34:07
【问题描述】:

我必须写一个文件来增加一个值,但有时(当文件连续打开两次时)它只增加一个而不是两个。

这是连续执行两次的脚本的一部分:

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() 无法正常工作的问题?
  • 真的需要在一次执行中多次打开/读取/写入/关闭文件吗?如果您将数据的承诺移到文件的末尾,那么您的代码的稳定性、服务器上的 IO 负载、脚本的响应能力以及您的理智会更好每次执行仅发生一次,并且仅在必要时发生。否则,为了事务的简单性和原子性,您最好使用数据库。
  • @Sammitch 这是一个计数器,所以我想我需要这样做...如果您有更好的解决方案,请写在这里:)
  • @MaximKhan-Magomedov 好主意,如果我不能使用flock函数我会考虑的

标签: php file overwrite


【解决方案1】:

不清楚您在做什么,因为您只提供了代码的零碎部分,并且没有显示读取文件的内容;但是如果你想增加文件中的值,你应该在你从锁定文件中读取的数字上加一——而不是写一个你传递给@987654322的参数($impressions+1) @ 从外部。重新考虑代码的逻辑并修复它。

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多