我有一个用于从命令行(通过supervisord)运行的gearman的php worker,它充当一种“API”。工作人员使用 mysqli 连接从数据库中检索数据并将其发送回连接的客户端。
class My_worker{
private $worker;
static $SQL;
public function __construct($SQL){
$this->worker = new GearmanWorker();
$this->worker->addServer();
self::$SQL = $SQL;
//register workers
$this->worker->addFunction("testA", array($this, 'testA') );
$this->worker->addFunction("testB", array($this, 'testB') );
}
public function run(){
while ($this->worker->work());
}
static function testA(){ /* select field1 from DB; fetch row; return serialized; */}
static function testB(){ /* select field2 from DB; fetch row; return serialized; */}
}
//start worker
$sql = new DB(SQL_HOST, SQL_USER, SQL_PWD, SQL_DB); // Extends mysqli class
$worker = new My_worker($sql);
$worker->run();
}
所以,我有两个函数“ testA ”和“ testB ”,它们可以从数据库中进行某些选择。问题在于它们共享相同的数据库连接,因此如果同时对两个函数都有请求,则可能会从“错误”选择中获得结果,即testB从testA而不是testB调用的 select 中获取结果。
除了在每个函数中打开单独的数据库连接之外,有什么方法可以避免这种情况?