php - 动态更新Singleton类的值

时间:2015-03-31 17:14:10

标签: php dynamic singleton

这是this question

的后续问题

如果我将其声明为单身类:

// 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)!我也尝试过使用会话。

// 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 个答案:

答案 0 :(得分:0)

感谢@ Maximus2012和@Sammitch。

我从Google小组的以下帖子中得到了一个想法

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

我使用外部.txt文件来存储标志并设置塞子而不是所有这些惨败;)

<强>更新

我发现为什么在这种情况下不可能与单身人士合作。每次调用php时,都会创建一个单独的进程(或线程,具体取决于服务器)来处理该请求,即start.phpstop.php的单独进程(或线程),并且它们无法访问由于“进程间隐私”,单身人士!

但是,如果我将start.php和stop.php作为单个进程运行,它会正常工作!