在不同用户之间共享PHP单例对象

在不同用户之间共享PHP单例对象

问题描述:

我正在开发一个Web应用程序,它可以让用户登录并给出由管理员安排的考试。我有一个“累积”功能,应该在所有用户完成测试并更新数据库后(根据某种逻辑)自动运行。在不同用户之间共享PHP单例对象

我知道我可以使用数据库来保存正在进行测试的用户的存储,并据此运行逻辑,但我有兴趣知道这是否可以通过单例类来完成。

我的代码:

class ScoreBoard{ 
    var $current; 
    private static $board=NULL; 
    // private static $current=0; 
    private function __construct() { 
    $this->current=0; 
    } 
    static function scoreboard(){ 
    if(!self::$board){ 
     self::$board= new ScoreBoard(); 
     $this->log("Created new"); 
     // return self::$board; 
    } 
    return self::$board; 
    } 
    function add(){ 
    $this->current+=1; 
    $this->log("add ".$this->current); 
    } 
    function subtract(){ 
    $this->current-=1; 
    $this->log("subtract ".$this->current); 

    // file_put_contents("scoreboard.txt",self::$current); 
    if($this->current<0) 
     $this->current=0; 
    if($this->current<=0) 
     { 
      $this->accumulate(); 
      self::$board=NULL; 
     } 
    } 
} 

而在startExam.php文件,我调用这个函数为:

$scoreboard= ScoreBoard::scoreboard(); 
$scoreboard->add(); 

而且做

$scoreboard= ScoreBoard::scoreboard(); 
$scoreboard->subtract(); 

考试时结束。因此,当每个用户开始检查时,应该调用单例对象函数,当他结束时,应调用函数subtract。但是,这似乎并没有因为某些原因,$current永远不会增加超过1.

请让我知道,如果我想要做什么是可能的或不。如果有更好的方法来实现我想做的事,谢谢。

+1

不,PHP没有共享内存。每个单例只对那个特定的请求是唯一的,10个并发用户将导致10个“单例”实例 – Steve 2014-10-29 17:20:29

+0

哦谢谢你的帮助:)所以使用数据库/文件写入是我唯一的选择?另外,为了运行'accumulate'函数,我必须每次都要计算数据库中的所有条目,以检查这是最后一个用户还是他们的更好选择? – sudshekhar 2014-10-29 17:31:54

你可以使用Memcached实现这一目标 -

你的构造函数,随后将是这个样子:

$this->memcache = new Memcached(); 
$this->memcache->addServer("127.0.0.1", "11211") // I think that's the right port for default. 
$this->current = $this->memcache->get("current"); 

但是你可以通过存储在一个文件中的值做同样的逻辑 - 这会更容易...

+0

谢谢!我试图避免过多的文件写入/数据库读取,但我想没有办法绕过它。 Memcache比这些选项更快吗? – sudshekhar 2014-10-29 17:38:52

+0

Memcache是​​最快的!我强烈建议使用它作为你的SESSION处理程序。 – 2014-10-29 17:40:12

+1

谢谢!我以前没有用过Memcache,但现在就试试看! – sudshekhar 2014-10-29 17:46:04