2013-08-04 1 views
0

나는 이것이 PHP 사용자 대부분을위한 다소 기본적인 질문이라고 생각합니다.PHP : DB에서 언제 결과를 공개 할 예정입니까?

<?php 
    define("DB_HOST", "localhost"); 
    define("DB_NAME", "dbname"); 
    define("DB_USER", "admin"); 
    define("DB_PASSWORD", "abcdefg"); 

    $connection; 
    $result; 

    function connectDatabase() { 
     global $connection; 

     if(isset($connection)) return; 

     $connection = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
     if(mysqli_connect_errno()) { 
      die("Database connection failed: " . mysqli_connect_error() . " (" . mysqli_connect_errno() . ")"); 
     } 

    } 

    function queryDatabase($query) { 
     global $connection, $result; 
     $result = mysqli_query($connection, $query); 
     if(!$result) { 
      die("Database query failed"); 
     } 
     else { 
      return $result; 
     } 
    } 

    function releaseResult() { 
     global $result; 
     mysqli_free_result($result); 
    } 

    function closeConnection() { 
     global $connection; 
     mysqli_close($connection); 
    } 
?> 

을 내가 같이 호출 현실을 가정 해 봅시다 : 이제 내가 DB 작업이 파일을 가정 해 봅시다

<?php 
    require_once("db_connection.php"); 

    function createNavigation() { 
     connectDatabase(); 
     $query = "SELECT * "; 
     $query .= "FROM subjects "; 
     $query .= "ORDER BY position ASC"; 
     $result = queryDatabase($query); 
     while($subject = mysqli_fetch_assoc($result)) { 
      //do something 
     } 
     releaseResult(); 
    } 
?> 

문제는 - 내가 실제로 로컬 $ 결과를 공개해야합니까 createNavigation 함수에서 또는 너무 필요하지 않은가?

어쨌든 mysqli_free_result에는 어떤 이점이 있습니까? 다른 OOP 언어에서 나오는 것은 객체, GC, 메모리 관리 등을 해제/파괴/무효로하는 것을 이해하지만 스크립트에서 한 번만 실행하면 PHP가 좋은 점을 혼란스럽게합니다. 고맙습니다!

답변

0

실제로는 특별히 필요하지 않습니다. 대부분의 PHP 스크립트는 HTTP를 통해 액세스하도록 작성됩니다. 즉, 스크립트가 잠깐 실행 된 다음 중지되고 그 시점에서 메모리가 해제됩니다. 내가 이것이 중요하다는 것을 알 수있는 유일한 실용적인 이유는 영구 스크립트를 실행하고있는 경우입니다. 예를 들어 데몬으로 빌드 한 스크립트를 시작한 경우와 중지 할 때까지 계속 실행하는 것입니다. 그 시점에서 결과를 공개하면 메모리 공간이 늘어나지 않습니다.

보안을 위해, 향후 호환성을 고려해야하고, OOP 배경에서 왔다고 말했기 때문에 아마도 mysqli_ * 함수 대신 PDO를 사용해야 할 것입니다. MySQL 연결을 설정하려면 새 PDO 개체를 만듭니다. 리소스를 확보하려면 객체 (또는 경우에 따라 결과)의 설정을 해제하면됩니다.

+0

감사합니다. PDO를 확인합니다. – Fygo

1

PHP를 사용하여 리소스를 효과적으로 관리하는 데 도움이됩니다. 당신이 그것을 부르지 않는다면, 자원은 PHP에 의해 정리 될 것이지만, 더 이상 필요 없다는 것을 알 때 그것을 직접 호출하고 제거하는 것이 낫다.

극히 짧은 시간에 실행되는 스크립트의 극단적 인 예를 보겠습니다. 처음에는 데이터베이스 연결이 열리고 매우 짧게 만 필요합니다. 스크립트가 끝나면 리소스 (데이터베이스 연결 등)는 해제되지만 연결은 필요한 것보다 0.8 초 길게 열릴 수 있습니다. 이제 여러 명의 사용자가 페이지를 평행하게 추가하고 특정 시간에이 연결의 인스턴스가 많이 열리게되었습니다. 반면에 연결을 바로 정리하면 필요한 인스턴스가 줄어 듭니다.

관련 문제