2012-06-14 20 views
1

我正在致力於在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 

更新
這段代碼是要放在我們的廣告投放服務器在數目多,服務的高流量。我想在這樣的條件下處理資源的釋放變得重要,這是爲什麼這是在原始文件中完成的。有人可以評論這個嗎?謝謝...

+0

我有更糟糕的情況。因爲我可能在執行後選擇並插入同一個文件中,所以我不會獲取語句,因此無法調用closeCursor(),否則我無法找到如何執行的操作。 – Aram

+0

http://php.net/manual/en/class.pdostatement.php啓發瞭解決方案。首先,我必須做好準備,以便我能夠獲得對語句的引用,並在那之後調用執行,然後在連接之後以及在該語句之後的closeCursor之後執行,並且僅在該另一個查詢之後執行。 – Aram

回答

0

你不需要擔心,在腳本停止執行的時候; PHP通常會進行清理(GC sortof);清理所有打開的資源句柄等。
這就是爲什麼在使用文件時,您需要調用file handle上的close()方法,否則您的更改可能無法保存,因爲PHP只是清理乾淨。
總之,您可以將該部分從代碼庫中取出。

+0

我明白這一點。但是這段代碼將被放入我們的廣告投放服務器中,這些服務器的數量是多個(只是爲了分擔負載)並提供高流量。我想在這樣的條件下處理資源的釋放變得重要,這是爲什麼這是在原始文件中完成的。 –

+0

真的沒有我知道的'PDOObject-> free()'方法。所以我想你可能必須解決'unset($ PDOObject)'O_o –

+1

在這裏找到相關的東西 - http://us.php.net/manual/en/pdostatement.closecursor.php#65378 –

相關問題