mMaxClient = $max_clients; $this->mUsingClients = []; $this->mFreeClients = []; $this->mSuspendCIDS = []; $this->mStop = false; } public function get($cid) { if(array_key_exists($cid,$this->mUsingClients)) { $this->mUsingClients[$cid]['ref_count'] += 1; return $this->mUsingClients[$cid]['client']; } if(!empty($this->mFreeClients)) { $client = array_shift($this->mFreeClients); $this->mUsingClients[$cid] = ['client' => $client, 'ref_count' => 1,'ifTransacting' => false]; } elseif(count($this->mUsingClients) < $this->mMaxClient) { $client = $this->create_client(); $this->mUsingClients[$cid] = ['client' => $client, 'ref_count' => 1,'ifTransacting' => false]; } else { $this->mSuspendCIDS[] = Co::getCid(); Co::suspend(); $client = array_shift($this->mFreeClients); $this->mUsingClients[$cid] = ['client' => $client, 'ref_count' => 1,'ifTransacting' => false]; } return $client; } public function find($cid) { if(array_key_exists($cid,$this->mUsingClients)) { return $this->mUsingClients[$cid]['client']; } else { $msg = __METHOD__ . " mysqli cannot find mysqli cid={$cid} client"; Log::record($msg,Log::DEBUG); throw new Exception($msg); } } public function reset($cid,$client) { if(array_key_exists($cid,$this->mUsingClients)) { return $this->mUsingClients[$cid]['client'] = $client; } else { $msg = __METHOD__ . " mysqli cannot find mysqli cid={$cid} client"; Log::record($msg,Log::DEBUG); throw new Exception($msg); } } public function transaction($cid) { if(array_key_exists($cid,$this->mUsingClients)) { return $this->mUsingClients[$cid]['ifTransacting']; } else { $msg = __METHOD__ . " mysqli cannot find mysqli cid={$cid} client"; Log::record($msg,Log::DEBUG); throw new Exception($msg); } } public function begin($cid) { if(array_key_exists($cid,$this->mUsingClients)) { $this->mUsingClients[$cid]['ifTransacting'] = true; } else { $msg = __METHOD__ . " mysqli cannot find mysqli cid={$cid} client"; Log::record($msg,Log::DEBUG); throw new Exception($msg); } } public function commit($cid) { if(array_key_exists($cid,$this->mUsingClients)) { $this->mUsingClients[$cid]['ifTransacting'] = false; } else { $msg = __METHOD__ . " mysqli cannot find mysqli cid={$cid} client"; Log::record($msg,Log::DEBUG); throw new Exception($msg); } } public function rollback($cid) { if(array_key_exists($cid,$this->mUsingClients)) { $this->mUsingClients[$cid]['ifTransacting'] = false; } else { $msg = __METHOD__ . " mysqli cannot find mysqli cid={$cid} client"; Log::record($msg,Log::DEBUG); throw new Exception($msg); } } public function put($cid) { if(array_key_exists($cid,$this->mUsingClients)) { $this->mUsingClients[$cid]['ref_count'] -= 1; $refcount = $this->mUsingClients[$cid]['ref_count']; if($refcount == 0) { $client = $this->mUsingClients[$cid]['client']; unset($this->mUsingClients[$cid]); $this->mFreeClients[] = $client; $suspend_cid = $this->getSuspend(); if($suspend_cid > 0) { Co::resume($suspend_cid); } } } else { $msg = __METHOD__ . " mysqli cannot find mysqli cid={$cid} client"; Log::record($msg,Log::DEBUG); throw new Exception($msg); } } private function getSuspend() { if (empty($this->mSuspendCIDS)) { return 0; } else { $cid = array_shift($this->mSuspendCIDS); return $cid; } } public function stoped() { return $this->mStop; } public function stop() { $this->mStop = true; } abstract public function create_client(); }