2014-10-29 4 views
2

사용자가 로그인하여 관리자가 예약 한 시험을 제공 할 수있는 웹 응용 프로그램을 작성 중입니다. 나는 모든 사용자가 테스트를 제공하고 (일부 로직에 따라) 데이터베이스를 업데이트하고 나면 자동으로 실행되어야하는 "축적"기능을 가지고 있습니다.다른 사용자간에 PHP 싱글 톤 객체 공유하기

나는 데이터베이스를 사용하여 현재 테스트를 실시하고 그에 따라 논리를 실행하는 사용자 저장소를 유지할 수 있음을 알고 있지만 이것이 싱글 톤 클래스로 수행 할 수 있는지 알고 싶어합니다.

내 코드 :

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

그리고 시험이 종료 될 때

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

일 :

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 파일에 내가으로이 함수를 호출하고

. 따라서 각 사용자가 시험을 시작할 때 싱글 톤 객체 add 함수를 호출해야하며 함수가 끝나면 subtract 함수를 호출해야합니다. 그러나 이것은 어떤 이유로 작동하지 않는 것 같고 은 결코 1 이상으로 증가하지 않습니다.

내가하려는 일이 가능한지 여부를 알려주세요. 그리고 내가하고 싶은 것을 성취 할 수있는 더 좋은 방법이 있다면. 고마워.

+1

아니요, PHP에는 공유 메모리가 없습니다. 각 싱글 톤은 특정 요청에 대해서만 고유합니다. 10 명의 동시 사용자가 10 '싱글 톤 인스턴스가됩니다. – Steve

+0

오우 감사합니다. :) 그래서 데이터베이스/파일 쓰기를 사용하는 것이 유일한 방법입니까? 또한'accumulate' 함수를 실행하기 위해 매번 데이터베이스의 모든 항목을 계산하여 마지막 사용자인지 또는 더 나은 옵션인지 확인해야합니까? – sudshekhar

답변

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"); 

을하지만, 당신이 파일의 값을 저장 통해 같은 논리를 할 수있는 - 그 ...

+0

감사합니다! 나는 과도한 파일 쓰기/데이터베이스 읽기를 피하려고 노력했다. 그러나 나는 그 주위에 어떤 방법도 없다고 생각한다. 이러한 옵션보다 Memcache가 빠릅니까? – sudshekhar

+0

Memcache가 가장 빠름 -! 세션 처리기로 사용하는 것이 좋습니다. –

+1

감사! 나는 전에 Memcache를 사용하지 않았지만 지금 시도 할 것이다! – sudshekhar