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