2012-06-14 34 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 –

相关问题