コマンドラインから (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 接続を開く以外に、これを回避する方法はありますか?