如题,举个例子,有个方法,里面逻辑大概如下:
function test(){
    $a = $db->query('...');//返回1或0
    if($a == 1){
        $db->set(0);//更新后下次执行此方法$a不再会是1.
        //这里是其它逻辑,问题是,如果很多请求同时调用此方法,而此方法中的set过程又稍长,那么这里的逻辑就会被执行多次,与预计的只能执行一次是不符的。
    }
}
请问大家一般怎么处理这种情况?对于投票或者跟奖品等安全性要求较高时这种情况很多。
如果用session的话请求可能来自不同的ip,如果用memcached之类的缓存保存状态,同样是有网络延迟的,shmop?求高见。

解决方案 »

  1.   

    ON DUPLICATE KEY UPDATE 看下这个用法
      

  2.   

    session记录ip地址在做判断不行?
      

  3.   

    if(isset($_SESSION['time'])&&time()-$_SESSION['time']<30){
    echo '<script>alert("Ban repeated comments within 30 seconds");location.href="'.$ymurl.'";</script>';
    exit;
    }
    SESSION保存时间在做判断行不?
      

  4.   

    if(isset($_SESSION['time'])&&time()-$_SESSION['time']<30){
    echo '<script>alert("Ban repeated comments within 30 seconds");location.href="'.$ymurl.'";</script>';
    exit;
    }
    SESSION保存时间在做判断行不?
      

  5.   

    对单个IP或者启用了session的情况下有一定用处,但一般出现我说的情况很可能是投票机之类的,可能是独立的session,也可能是不同的ip。而且现在我们的session还是存在memcached中的,也可能导致不能实时同步。其实我需要的东西就是可以内存共享而且线程安全的东东。
      

  6.   

    对你的意见是好好去看看session是干嘛用的。。还什么单个ip 还启用的情况 还什么投票机 。。
      

  7.   

    想问下你用php多久了,这个很重要,我才能理解你想干嘛
      

  8.   


    我反问你,如果不同的ip过来访问,你还能共享session中的值?session是指某个会话吧,ip都不同了还是某一个会话?
    做WEB也六七年了,对http还是很了解的,.net , asp都搞过, php用了半年,.net至少有静态变量,至少有lock锁线程,asp至少也有application,你说php用什么代替asp中的application?
      

  9.   

    没冒犯的意思你的提问太难让人懂.什么国家大选的投票机限制的这么严格?
    用上cookie,只允许固定会员投票一次,在严点那你就限制ip段。你想完全限制别人刷票那是没有任何可能的,能做的只是让别人麻烦点,别人会清cookie,注册新会员,用代理。
      

  10.   

    你想在内存中解决?别人结束进程后那不又一样。。那不跟session一个道理???
      

  11.   


    首先,只要是有奖品的投票,必然会有刷票的可能,只有奖品够高,必定有人写投票机,至少我是写过。只要有了投票机,cookie,session神马依赖于客户端的都是浮云。何况,你们的数据提交验证都是在客户端验证,不在服务器端验证么,你不觉得我提到的问题是个隐藏的大bug么。当然,你说的思考问题的方式,当然有很多非技术的其它方式,比如设置其它各种门槛,但是我既然来CSDN,也只是想探讨一下技术问题而已。另外,你不
      

  12.   


    你不觉得我说的这些都是很正常的技术问题吗。结了吧,讨论有点激烈,没别的意思,有冒犯不要往心里去,毕竟是做技术的人,你说的session是可以解决一部分问题的,其实我主要想了解的是php有没有关于共享内存和线程安全的解决方案,我也没表达清楚,还是谢谢你了。