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();
它不起作用:塞子仍然是假的(已尝试 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
感谢@Maximus2012 和@Sammitch。
我从 Google 组
的以下帖子中得到了一个想法
https://groups.google.com/d/msg/phirehose-users/dvCZ9EvCNA8/nOiv3m2ByAEJ
我使用外部 .txt
文件来存储标志并设置停止器而不是所有这些惨败 ;)
更新
我发现了为什么在这种情况下无法使用单例。每次调用 php 时,都会创建一个单独的进程(或线程,取决于服务器)来处理该请求,即 start.php
和 stop.php
的单独进程(或线程),它们可以由于 "inter process privacy"!
,无法访问同一个单例
但是如果我 运行 start.php 和 stop.php 作为一个单一的进程它工作,正如预期的那样!
这是
如果我将其声明为单例 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();
它不起作用:塞子仍然是假的(已尝试 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
感谢@Maximus2012 和@Sammitch。
我从 Google 组
的以下帖子中得到了一个想法https://groups.google.com/d/msg/phirehose-users/dvCZ9EvCNA8/nOiv3m2ByAEJ
我使用外部 .txt
文件来存储标志并设置停止器而不是所有这些惨败 ;)
更新
我发现了为什么在这种情况下无法使用单例。每次调用 php 时,都会创建一个单独的进程(或线程,取决于服务器)来处理该请求,即 start.php
和 stop.php
的单独进程(或线程),它们可以由于 "inter process privacy"!
但是如果我 运行 start.php 和 stop.php 作为一个单一的进程它工作,正如预期的那样!