Как получить доступ к параметру объекта, созданного в одном демоноподобном скрипте из другого демоноподобного скрипта
Я пытаюсь написать игровой сервер на основе Workerman.
Основная идея такова: список работников принимает сообщения от клиентов и помещает их в очередь (RabbitMQ), другая группа работников получает сообщения из очереди, выполняет некоторые вычисления и соответственно обновляет экземпляр GameWorld.
Сам экземпляр GameWorld создается при запуске основного процесса, рабочие создаются после создания объекта GameWorld. Итак, я написал фиктивный класс Server:
namespace Server;
use \Workerman\Worker;
use \Workerman\Lib\Timer;
class Server {
private $name;
public function setName(string $name){
$this->name = $name;
}
public function printName(){
echo $this->name;
}
}
Также я написал два простых работника только для тестирования концепции обновления объекта от разных работников.
Первый (start_worker1.php
):
use \Workerman\Worker;
use \Workerman\Lib\Timer;
use \Server\Server;
global $ws_worker;
$ws_worker = new Worker('Websocket://0.0.0.0:8000');
$ws_worker->name = 'FirstWorker';
$ws_worker->onWorkerStart = function($ws_worker)
{
$ws_worker->server = new Server();
$ws_worker->server->setName("FirstName");
echo "worker1 started\n";
$ws_worker->is_started = TRUE;
var_dump($ws_worker);
};
Здесь я создал новый объект Server и дал ему имя, а также изменил свойство $ws_worker->is_started
TRUE (по умолчанию установлено значение False).
Во-вторых (start_worker2.php
):
use \Workerman\Worker;
use \Workerman\Lib\Timer;
global $ws_worker;
$worker = new Worker('Websocket://0.0.0.0:8001');
$worker->name = 'SecondWorker';
// here I'm checking, if I had an object of the first worker
// and actually it outputs all the data about first worker object,
// but $ws_worker->server is NULL and $ws_worker->is_started = FALSE
// This is confusing me so much..
var_dump($ws_worker);
// here I'm trying to detect when first worker is started
// but it return false all the time..
while(!$ws_worker->is_started){
var_dump($ws_worker->is_started);
sleep(1);
}
$worker->onWorkerStart = function() use($ws_worker){
echo "worker2 started\n";
var_dump($ws_worker);
$ws_worker->sever->setName("NewName");
};
Здесь я создал второго работника и попытался получить доступ server
свойство первого рабочего объекта, но безуспешно..
Все это начинается так:
use Workerman\Worker;
use Server\Server;
if(strpos(strtolower(PHP_OS), 'win') === 0)
{
exit("start.php does not support windows, please use start_for_win.bat\n");
}
if(!extension_loaded('pcntl'))
{
exit("Error! <pcntl> extension not found! Please install pcntl extension.");
}
if(!extension_loaded('posix'))
{
exit("Error! <posix> extension not found! Please install posix extension.");
}
define('GLOBAL_START', 1);
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/start_worker1.php';
require_once __DIR__ . '/start_worker2.php';
// Run all services
Worker::runAll();
Я думаю, что в worker2 я могу получить доступ к объекту worker1 перед функцией $ws_worker->onWorkerStart
оценивается, но я понятия не имею, как получить доступ к объекту worker1 в режиме реального времени (я имею в виду - получить доступ к текущему состоянию объекта).
Должен сказать, я новичок в программировании в стиле PHP ООП. Поэтому, пожалуйста, покажи мне, где моя ошибка. Подробное объяснение высоко ценится.