我正在致力於在Tera-WURFL的數據庫連接器文件中用mysqli
替換PDO
的用法,因爲我們的服務器具有PHP 5.2.6,並且mysqli在5.3.0之前不支持持久連接。正確的PDO方式來處理多個查詢的存儲過程後釋放資源?
所以,我用PDO代碼替換了所有的mysqli代碼。與基本數據檢索和處理已經完成,我是來釋放資源,在這裏我不知道這部分究竟如何替換以下 -
protected function cleanConnection(){
while($this->dbcon->more_results()){
$this->dbcon->next_result();
$res = $this->dbcon->use_result();
if ($res instanceof mysqli_result){$res->free();}
}
}
上述函數調用後調用每次存儲過程。我想這個函數可以獲取任何剩餘的結果並清除主從機之間的管道。如果我認爲是正確的,有人可以回答,並解釋爲什麼只有在這種情況下才能做到這一點。
以下是從萬億WURFL的數據庫連接器文件,該文件調用上面的功能之後的樣品存儲過程呼叫 -
$query = sprintf("CALL ".TeraWurflConfig::$TABLE_PREFIX."_RIS(%s,%s,%s)",$this->SQLPrep($userAgent),$tolerance,$this->SQLPrep($matcher->tableSuffix()));
$res = $this->dbcon->query($query); //this calls TeraWurfl_RIS() stored proc
if(!$res){
throw new Exception(sprintf("Error in DB RIS Query: %s. \nQuery: %s\n",$this->dbcon->error,$query));
exit();
}
$data = $res->fetch_assoc();
$this->cleanConnection(); //calling cleanConnection()
以下是存儲過程被調用以上 -
CREATE PROCEDURE `TeraWurfl_RIS`(IN ua VARCHAR(255), IN tolerance INT, IN matcher VARCHAR(64))
BEGIN
DECLARE curlen INT;
DECLARE wurflid VARCHAR(64) DEFAULT NULL;
DECLARE curua VARCHAR(255);
SELECT CHAR_LENGTH(ua) INTO curlen;
findua: WHILE (curlen >= tolerance) DO
SELECT CONCAT(LEFT(ua, curlen),'%') INTO curua;
SELECT idx.DeviceID INTO wurflid
FROM TeraWurflIndex idx INNER JOIN TeraWurflMerge mrg ON idx.DeviceID = mrg.DeviceID
WHERE mrg.match = 1 AND idx.matcher = matcher
AND mrg.user_agent LIKE curua
LIMIT 1;
IF wurflid IS NOT NULL THEN
LEAVE findua;
END IF;
SELECT curlen - 1 INTO curlen;
END WHILE;
SELECT wurflid as DeviceID;
END
我到目前爲止得到的東西
protected function cleanConnection($resultObj){
if($resultObj instanceof PDOStatement)
{
while($res = $resultObj->fetch()){
if ($res instanceof PDO){$res = null;}
}
}
}
這是我如何打電話 -
$query = sprintf("CALL ".TeraWurflConfig::$TABLE_PREFIX."_RIS(:userAgent,:tolerance,:tableSuffix)");
$queryHandle = $this->dbcon->prepare($query);
$queryHandle->execute(array(':userAgent' => $userAgent,':tolerance' => $tolerance,':tableSuffix' => $matcher->tableSuffix()));
$data = $queryHandle->fetch();
$this->cleanConnection($queryHandle); //calling here
更新
這段代碼是要放在我們的廣告投放服務器在數目多,服務的高流量。我想在這樣的條件下處理資源的釋放變得重要,這是爲什麼這是在原始文件中完成的。有人可以評論這個嗎?謝謝...
我有更糟糕的情況。因爲我可能在執行後選擇並插入同一個文件中,所以我不會獲取語句,因此無法調用closeCursor(),否則我無法找到如何執行的操作。 – Aram
http://php.net/manual/en/class.pdostatement.php啓發瞭解決方案。首先,我必須做好準備,以便我能夠獲得對語句的引用,並在那之後調用執行,然後在連接之後以及在該語句之後的closeCursor之後執行,並且僅在該另一個查詢之後執行。 – Aram