在不同用户之间共享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.
请让我知道,如果我想要做什么是可能的或不。如果有更好的方法来实现我想做的事,谢谢。
你可以使用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");
但是你可以通过存储在一个文件中的值做同样的逻辑 - 这会更容易...
谢谢!我试图避免过多的文件写入/数据库读取,但我想没有办法绕过它。 Memcache比这些选项更快吗? – sudshekhar 2014-10-29 17:38:52
Memcache是最快的!我强烈建议使用它作为你的SESSION处理程序。 – 2014-10-29 17:40:12
谢谢!我以前没有用过Memcache,但现在就试试看! – sudshekhar 2014-10-29 17:46:04
不,PHP没有共享内存。每个单例只对那个特定的请求是唯一的,10个并发用户将导致10个“单例”实例 – Steve 2014-10-29 17:20:29
哦谢谢你的帮助:)所以使用数据库/文件写入是我唯一的选择?另外,为了运行'accumulate'函数,我必须每次都要计算数据库中的所有条目,以检查这是最后一个用户还是他们的更好选择? – sudshekhar 2014-10-29 17:31:54