2012-06-14 2 views
1

의 사용을 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 

업데이트 -

는 그리고 이것은 내가 부르고 방법이다. 나는 이러한 조건 하에서 자원 해방을 처리하는 것이 중요한 이유가 무엇인지를 추측한다. 누군가가 이것에 대해 논평 할 수 있습니까? 감사합니다 ...

+0

나는 더 나쁜 시나리오가 있습니다. 이후에 같은 파일을 선택하여 삽입 할 수도 있기 때문에 실행 결과를 얻지 못할 것이므로 closeCursor()를 호출 할 방법이 없으며 그렇지 않은 방법을 찾을 수 없습니다. – Aram

+0

http://php.net/manual/en/class.pdostatement.php가 해결책을 찾았습니다. 먼저 문에 대한 참조를 얻고 해당 호출이 실행될 때 연결 후 및 그 closeCursor on 문 다음과 그 다른 쿼리 후에 만 ​​실행되도록 준비해야합니다. – 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 –