2015-03-31 69 views
0

這是一個後續問題要this questionPHP - 動態更新Singleton類的價值

如果我聲明這是一個單例類:

// Server.php 
class Server { 
    private $stopper; 
    private static $instance; 

    public static getInstance() { 
    if(!isset(self::$Server)) 
     self::$Server = new static(); 
    return self::$Server; 
    } 

    public function setStopper() { $this->stopper = TRUE; } 

    public function startServer() { 
    $self = $this; 
    $consumer = new Consumer(); 
    $consumer->onConsume(function($data) use($self, $consumer) { 
     // some processing 
     if($self->getStopper()) { // always false 
     $consumer->stop(); 
     $self->stopServer(); 
     } 
    }); 
    $consumer->consume(); 
    } 

    public function stopServer() { ... } 

} 

並用下面的腳本來啓動服務器:

// start.php 
$server = Server::getInstance(); 
$server->startServer(); 

以下腳本設置塞子:

// stop.php 
$server = Server::getInstance(); 
$server->setStopper(); 

它不起作用:擋塊仍然是假的(嘗試echo ing)!另外我也嘗試過使用會話。

// start.php 
$server = new Server(); 

session_start(); 
$_SESSION['server'] = $server; 
session_write_close(); 

$server->startServer(); 

// stop.php 
session_start(); 
$server = $_SESSION['server']; 
$server->setStopper(TRUE); 

但在運行stop.php拋出以下錯誤:Undefined index: server

+1

public function setStopper(){...}中的代碼是什麼樣子的? – Maximus2012 2015-03-31 17:16:07

+0

因爲您在2個不同的文件中調用這些函數,所以變量的範圍可能會丟失。基本上你需要爲兩個完全不同的文件創建2個單獨的類實例。 – Maximus2012 2015-03-31 17:17:34

+0

對不起,我剛剛從我的其他問題複製了代碼。修復! – 2015-03-31 17:17:37

回答

0

感謝@ Maximus2012和@Sammitch。

我從以下螺紋的想法來自谷歌組

https://groups.google.com/d/msg/phirehose-users/dvCZ9EvCNA8/nOiv3m2ByAEJ

我用了一個外部.txt文件來存儲一個標誌,並設置止動器,而不是這一切的慘敗;)

更新

我發現爲什麼它不可能在這種情況下與單身人士一起工作。每次調用php時,都會創建一個單獨的進程(或線程,取決於服務器)來處理該請求,即針對start.phpstop.php的單獨進程(或多個線程),並且由於「進程間隱私」而無法訪問相同的單個進程!

但是,如果我運行start.php和stop.php作爲一個單獨的進程它的工作原理,正如所料!