new worker单独处理定时器的问题

javascript

Gateway游戏项目,不同房间游戏开始之前定时30秒,30秒后开始处理游戏,上次的问题虽然搞定了异步进行,现在问题是前端显示会跳过秒数,比如30 29 直接27了这样,这个秒数我是从数据库读出来每一秒都返回给前端,会不会是这个频繁操作数据库引起的?如果客户端开多了房间,我估计很快就卡住了,看了社区的问题想单独开启个进程来处理定时器,麻烦指导下该怎么做,新手, 谢谢了。

下面是别人问题中的 http://wenda.workerman.net/?/question/1020
Events.php

public static function onConnect($client_id)
    {
        $task_connection = new AsyncTcpConnection('Text://127.0.0.1:13000');
        $task_connection->send('send to task workerman');
        $task_data = array(
            'function' => 'send_mail',
            'args' => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'),
        );
        $task_connection->send(json_encode($task_data));
        $task_connection->onMessage = function($task_connection, $task_result){
             // 结果
             var_dump($task_result);
             // 获得结果后记得关闭链接
             $task_connection->close();
        };
        // 执行异步链接
        $task_connection->connect();
}

然后这段代码该放在哪里呢

$task_worker = new Worker('Text://127.0.0.1:13000');
$task_worker->count = 10;
$task_worker->name = 'TaskWorker';
$task_worker->onMessage = function($connection, $task_data){
    $task_data = json_decode($task_data, true);
    $task_result = 'fuck you';
    $connection->send(json_encode($task_result));
};
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}
阅读 1919
3个回答

walkor

一个简单的倒计时为什么读数据库呢?直接一个每秒一次的定时器记录下变量累减就好了。

定时器放在单独进程或者其它进程都可以,看自己会哪种。

  • javascript 2017-07-06

    不同房间游戏开始的时候倒计时累减的变量不会被覆盖吗

walkor

操作不同的变量就好了。
例如搞个全局数组

global $time_map;
$time_map = array(
    '房间1' => 当前秒数,
    '房间2' => 当前秒数,
     ...
)
Timer::add(1, function()use($房间号, $connection){
    global $time_map;
    $time_map--;
    $connection->send($time_map);
});
  • javascript 2017-07-06

    谢谢,我试试。。。。use 里面的$connection参数是什么来的。发送到哪里去的

高级开发架构师

你好,能说下workman怎么new worker 单独处理定时器吗

  • 暂无评论