의 사용을 Tera-WURFL의 데이터베이스 커넥터 파일에있는 PDO
으로 대체하려고합니다. 우리 서버는 PHP 5.2.6이고 mysqli는 5.3.0까지 영구 연결을 지원하지 않기 때문에.여러 개의 쿼리를 사용하여 저장 프로 시저를 수행 한 후 리소스를 해제 할 수있는 적절한 PDO 방식?
그래서 모든 mysqli 코드를 PDO 코드로 바꿀 예정입니다. 기본 데이터 검색 및 처리를 수행하는 데, 나는 정확히 어떻게 대체 나는 확실하지 않다 자원을 확보의이 부분에 온 다음 -
protected function cleanConnection(){
while($this->dbcon->more_results()){
$this->dbcon->next_result();
$res = $this->dbcon->use_result();
if ($res instanceof mysqli_result){$res->free();}
}
}
위의 함수는 호출 한 후 때마다 호출 저장 프로 시저. 이 함수는 나머지 결과를 가져오고 마스터와 슬레이브 사이의 파이프를 정리합니다. 내가 추측 한 것이 맞다면 누군가 대답 할 수 있고, 왜이 경우에만이 일이 이루어 졌는지 설명 할 수있다.
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
-
$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()
저장 프로 시저가 위의 호출되고 다음 -
는 다음 후 위의 함수를 호출 테라 WURFL의 데이터베이스 커넥터 파일의 샘플 저장된 프로 시저 호출입니다 내가 지금까지 가지고있는 것
이 코드 조각이 수의 배수와 높은 트래픽을 제공 우리의 광고 게재 서버에 넣어 것입니다$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 on 문 다음과 그 다른 쿼리 후에 만 실행되도록 준비해야합니다. – Aram