Как получить доступ к параметру объекта, созданного в одном демоноподобном скрипте из другого демоноподобного скрипта

Я пытаюсь написать игровой сервер на основе 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 ООП. Поэтому, пожалуйста, покажи мне, где моя ошибка. Подробное объяснение высоко ценится.

0 ответов

Другие вопросы по тегам