我想使用workerman做與數(shù)據(jù)庫的長連接,所以我設(shè)置了全局變量$DataBaseConn,當(dāng)workerman進(jìn)程啟動時(shí),連接數(shù)據(jù)庫,$DataBaseConn作為連接標(biāo)識全局使用,如下所示:
$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回調(diào)里可以使用該變量查詢數(shù)據(jù)
$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進(jìn)程啟動時(shí)的回調(diào),這里初始化的全局?jǐn)?shù)據(jù)庫連接只屬于http_worker進(jìn)程,其它進(jìn)程例如webserver進(jìn)程無法使用這個(gè)數(shù)據(jù)庫連接。
你可以在$webserver->onWorkerStart中初始化一個(gè)屬于$webserver進(jìn)程自己的數(shù)據(jù)庫連接。
明白了,它們起的是不同的進(jìn)程,進(jìn)程間的全局變量不能共享,系統(tǒng)中除了它們這些進(jìn)程之外,還有一個(gè)進(jìn)程是主進(jìn)程嗎?是起調(diào)度作用嗎?