具有共享数据库连接的PHP gearman工作程序



我有一个gearman的php工作程序从命令行(通过supervisord)运行,它充当一种"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‘,它们从数据库中进行某些选择。问题是,它们共享同一个数据库连接,因此,如果同时有对两个函数的请求,则可能会从"错误"的选择中获得结果,即testBtestA而非testB中调用的选择中获取结果。

除了在每个函数中打开单独的DB连接之外,有没有其他方法可以避免这种情况?

IMHO,查询总是并行处理的,当前设置不应该有任何问题。我可以想象,通过使用PDO和事务

可以改善这一点

相关内容

  • 没有找到相关文章

最新更新