Это следующий вопрос к этому вопросу
Если я объявлю это как одноэлементный класс:
// 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
Спасибо @ 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 как один процесс, он работает, как и ожидалось!