关于workerman全局变量的使用

dreamboycx

我想使用workerman做与数据库的长连接,所以我设置了全局变量$DataBaseConn,当workerman进程启动时,连接数据库,$DataBaseConn作为连接标识全局使用,如下所示:

$http_worker = new Worker("http://0.0.0.0:80");

$http_worker->count = 1;
$DataBaseConn = null;

$http_worker->onWorkerStart = function($http_worker){
    global $DataBaseConn;
    $database = 'LOTINGO';
    $user = 'db2inst1';
    $password = 'db2inst1';
    $hostname = '192.168.1.129';
    $port = 50000;
    $dsn_db2 = "DATABASE=" . $database . ";HOSTNAME=" . $hostname . ";PORT=" . $port. ";PROTOCOL=TCPIP;UID=" . $user . ";PWD=" . $password . ";";
    $DataBaseConn = db2_connect($dsn_db2, '', '');
};

那么我在onMessage回调里可以使用该变量查询数据

$http_worker->onMessage = function($connection, $data)
{
    global $DataBaseConn;
    $sql = "select count(*) from table";
    $query = db2_exec($DataBaseConn,$sql);
    while ($res = db2_fetch_array($query)) {
      $result[] = $res;
    }
    $list = var_export($result,true);
    $connection->send($list);
};

那么该全局变量是否在workerman的任何地方使用?

然后我又启动了webserver

$webserver = new WebServer('http://0.0.0.0:81');
$webserver->addRoot('localhost', __DIR__ . '/web');

我在web目录下使用该全局变量为何打印为空呢?webserver不是基于workerman的吗?是不是在web下的php文件无法使用呢?
web/index.php里:

global $DataBaseConn;
var_dump($DataBaseConn);

显示为空。。。。

9388 1 0
1个回答

walkor

你贴的代码中$http_worker->onWorkerStart 是http_worker进程启动时的回调,这里初始化的全局数据库连接只属于http_worker进程,其它进程例如webserver进程无法使用这个数据库连接。

你可以在$webserver->onWorkerStart中初始化一个属于$webserver进程自己的数据库连接。

  • dreamboycx 2016-03-10

    明白了,它们起的是不同的进程,进程间的全局变量不能共享,系统中除了它们这些进程之外,还有一个进程是主进程吗?是起调度作用吗?

  • walkor 2016-03-10

    进程间关系可以去看手册原理部分

  • oshell 2019-04-03

    在$webserver->onWorkerStart中初始化一个属于$webserver进程

    请问这个怎么创建....

年代过于久远,无法发表回答
🔝