web-msg-sender中怎么使用Workerman/MySQL?$db连不上是怎么回事呢?

amhoho

我在web-sender中此处引入了之后,在其它地方例如on('connection'均无法获得该$db, 请教一下sender应该如何连接数据库
,使之可以global于其它地方.多谢了.
补充:/web-msg-sender/start_io.php原文中加入$inner_http_worker->onWorkerStart片段

...
$sender_io->on('workerStart', function(){
$inner_http_worker = new Worker('http://0.0.0.0:2121');

//新增开始
$inner_http_worker->onWorkerStart = function($inner_http_worker){
//数据库初始化,在其余地方都是服务使用$db;似乎onWorkerStart无法触发
global $db;
$db = new Workerman\MySQL\Connection('127.0.0.1', '3306', 'test', 'test', 'test');
};
//新增结束
//其余地方都引用不了$db

$inner_http_worker->onMessage = function($http_connection, $data){
    global $uidConnectionMap,$db;//比如这里$db就是null
    $_POST = $_POST ? $_POST : $_GET;
    switch(@$_POST){
        case 'publish':
            global $sender_io;
            $to = @$_POST;
            $_POST = htmlspecialchars(@$_POST);

...

3950 4 0
4个回答

xiuwang

用的时候没加global吧

  • amhoho 2017-11-06

    代码本身没有问题

  • xiuwang 2017-11-06

    报错和代码都贴出来看看?

  • amhoho 2017-11-06

    就是web-msg-sender/start_io.php中加提问中的代码,然后在别的地方就引用不了$db;代码没有改动.我补充下问题

walkor
$sender_io->on('workerStart', function(){
    global $db;
    $db = new Workerman\MySQL\Connection('127.0.0.1', '3306', 'test', 'test', 'test');
});

应该是这样。
onWorkerstart是子进程启动后的回调,然后$inner_http_worker是在onWorkerStart时创建的,这个$inner_http_worker不会再创建新的进程,所以$inner_http_worker->onWorkerStart不会执行到,所以db都是空的。

  • amhoho 2017-11-06

    原来这样,一会儿试一下,多谢解惑.我之前琢磨之后也是这样解决了,不过由于还不熟悉 workerman 所以想问清楚 谢了.

  • amhoho 2017-11-06

    再请教一下,前端socket.emit('login', 'a'),并且这个用户加入多个分组:$socket->join('a'),$socket->join('b'),$socket->join('c');,这样子的话$sender_io->to('a')固然是可以的,但to('b')的时候就会出现能发送给用户,但提示offline,这种加入多组后,给分组发送提示offline的情形应该怎么办呢.

xiuwang

学习了,还是要老大出马啊

  • 暂无评论
henry

请问楼主:
启动workerman后,前端调用的时候报错:Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
这个问题有遇到过吗

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