php - 动态更新 Singleton class' 值

php - Dynamically update Singleton class' value

这是

的后续问题

如果我将其声明为单例 class:

// 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();

它不起作用:塞子仍然是假的(已尝试 echoing)!我也尝试过使用会话。

// 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

感谢@Maximus2012 和@Sammitch。

我从 Google 组

的以下帖子中得到了一个想法

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

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

更新

我发现了为什么在这种情况下无法使用单例。每次调用 php 时,都会创建一个单独的进程(或线程,取决于服务器)来处理该请求,即 start.phpstop.php 的单独进程(或线程),它们可以由于 "inter process privacy"!

,无法访问同一个单例

但是如果我 运行 start.php 和 stop.php 作为一个单一的进程它工作,正如预期的那样!