我想使用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);
显示为空。。。。
你贴的代码中$http_worker->onWorkerStart 是http_worker进程启动时的回调,这里初始化的全局数据库连接只属于http_worker进程,其它进程例如webserver进程无法使用这个数据库连接。
你可以在$webserver->onWorkerStart中初始化一个属于$webserver进程自己的数据库连接。
明白了,它们起的是不同的进程,进程间的全局变量不能共享,系统中除了它们这些进程之外,还有一个进程是主进程吗?是起调度作用吗?
进程间关系可以去看手册原理部分
在$webserver->onWorkerStart中初始化一个属于$webserver进程
请问这个怎么创建....