0

コマンドラインから (supervisord を介して) 実行するギアマン用の php ワーカーがあり、一種の「API」として機能します。ワーカーは mysqli 接続を使用して DB からデータを取得し、接続されたクライアントに送り返します。

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();
}

したがって、たとえば、データベースから特定の選択を行う2 つの関数 ' testA ' と ' testB ' があります。問題は、それらが同じ db 接続を共有することです。そのため、両方の関数への要求が同時にある場合、「間違った」選択から結果が得られる可能あります

各関数で個別の DB 接続を開く以外に、これを回避する方法はありますか?

4

1 に答える 1

0

IMHO、クエリは常に並行して処理され、現在のセットアップに問題はないはずです。PDOとトランザクションを使用することでこれが改善されると想像できます

于 2013-08-08T08:01:54.850 に答える