PHPSOCKETIO中定时器和on函数的回调不在同一进程如何优雅地处理?

Nathan
<?php
use Workerman\Worker;
use Workerman\WebServer;
use Workerman\Autoloader;
use PHPSocketIO\SocketIO;
use Workerman\Lib\Timer;

// composer autoload
require_once __DIR__ . '/../../vendor/autoload.php';

$io = new SocketIO(2020);

class Data
{
    static $_instance = null;
    public static function instance(){
        if(self::$_instance == null)
            self::$_instance = new Data();
        return self::$_instance;
    }

    // ->{id1,id2,id3}
    public $match_quque = array();

    // ->$socket
    public $uid_mapping = array();
}

// 500ms检测一次匹配队列
Timer::add(0.5,function(){
    var_dump(Data::instance()->match_quque);
        print("my pid == ".getmypid());

});

$io->on('connection', function($socket)use($io){
    $socket->on('match', function ($data)use($socket){
        Data::instance()->match_quque[] = 1;
        print("my pid == ".getmypid());
        var_dump(Data::instance()->match_quque);
    });

});

if (!defined('GLOBAL_START')) {
    Worker::runAll();
}

// 打印出来的PID是不一样的 导致我无法在 on的回调中和定时器中共享同一份数据

3431 3 0
3个回答

walkor 打赏

根据手册,定时器要在onXXX函数里设置,在onXXXX外部设置属于主进程的定时器,所以属于不同进程。

你可以在
$io->on('workerStart', function(){});
里设置定时器

  • 暂无评论
Nathan

谢谢你

  • 暂无评论
walkor 打赏

不客气

  • 暂无评论
年代过于久远,无法发表回答
×
🔝