2013-09-30 3 views
2

데이터베이스 리소스를 얻어야하는 PHP 코드를 작성 중이며, 실행 중 잠긴 것으로 표시하고 완료되면 잠기지 않은 것으로 표시합니다. 잠금은 시작시 테이블의 값을 업데이트하여 얻어지며 어떤 이유로 든 스크립트가 종료되면 잠금을 해제하는 종료 함수를 등록했습니다.셧다운 함수에서 예외 잡기

내가 겪고있는 문제는 서버 (Microsoft SQL 데이터베이스 서버)에 대한 연결이 실제 환경에서 매우 안정적이지 않은 것으로 나타나며 비정상적인 스크립트 종료의 일반적인 원인 인 것 같습니다. 분명히 내가 연결되어 있지 않을 때 데이터베이스 리소스를 잠금 해제 할 수는 없지만 적어도 그 일을 깔끔하게 처리 할 수 ​​있기를 원합니다.

다음은 크게 축소 된 기본 스크립트입니다. 데이터베이스 잠금하지만 실패를 해제하려고 시도

내가 연결의 경우에 예상하고 있었다
$arr_shutdown_func = function() { 
     global $bol_locked, $obj_adaptor; 
     if ($bol_locked) { 
     echo "Releasing lock...\n"; 
     try { 
      echo $obj_adaptor -> unlock_server_db()? 
       "Done\n": 
       "Failed to unlock database! Use force_remote_db_unlock script to force a database unlock\n"; 
     } catch (PDOException $obj_ex) { 
      echo "Failed to unlock database! Use force_remote_db_unlock script to force a database unlock\n"; 
     } 
     } else { 
     echo "No lock to release\n"; 
     } 
    }; 

// Set up ctrl-c listener 
if (function_exists ('pcntl_signal')) { 
    pcntl_signal (SIGINT, $arr_shutdown_func); 
    pcntl_signal (SIGTERM, $arr_shutdown_func); 

// Register shutdown functions 
register_shutdown_function ($arr_shutdown_func); 
set_exception_handler ($arr_shutdown_func); 

스크립트에 대한 손실되는, 메시지에서 메아리 :

try { 
    echo "Connecting to server...\n"; 
    $obj_adaptor = get_remote_db(); 

    echo "Beginning sync...\n"; 
    if (FALSE != ($bol_locked = $obj_adaptor -> lock_server_db())) { 
     // Do work here 
    } else { 
     throw new RuntimeException ("Failed to obtain remote database lock!"); 
    } 
} catch (Exception $obj_ex) { 
    echo "Operation failed with an exception!\n\n"; 
    echo "Details: \n"; 
    echo $obj_ex -> getMessage() . PHP_EOL; 
    echo $obj_ex -> getTraceAsString() . PHP_EOL; 
} 

내 셧다운 기능은 다음과 같습니다 자물쇠를 풀 수 없다는 것.

그러나, 내가 실제로 얻을 것은 : 나는 그것이 셧다운 기능에서 예외를 포착하는 것이 가능 여부에 대한 확실한 대답을 찾기 위해 노력했지만 지금까지 많은 행운이 없었어요

PHP Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY000]: General error: 20047 DBPROCESS is dead or not enabled [20047] (severity 1) [(null)]' in Zend/Db/Statement/Pdo.php:238

그래서 나는 아직도보고있다. 그러나 종료 기능에서 예외를 처리하는 것이 가능하다면, 내가 적용하고있는 접근법에 무엇이 잘못된 것인지 알았다면 고맙겠습니다.

답변

0

나는이 코드를 간단한 코드로 테스트했는데 시스템 종료 전에 연결이 끊어지지 않습니다.

<?  
mysql_connect('localhost','xxx','xxx') or die(mysql_error()); 
mysql_select_db('xxx'); 
register_shutdown_function("s"); 

function s() { 
    echo 'xxxx'; 
    $qa = mysql_query('SELECT * FROM xxx') or die(mysql_error()); 
    while($q = mysql_fetch_array($qa)) { 
     print_r($q); 
    } 
} 
?> 

어떤 PHP 버전을 사용하고 있습니까?

PHP 5.5.3 (cli) (built: Aug 23 2013 08:41:45) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

+0

PHP 5.4.6-1ubuntu1.4 (cli) (빌드 : Sep 4 2013 19:36:09). 또한 Zend_DB는 PDO 데이터베이스 연결을 래핑하므로 예외가 발생하지 않습니다. – GordonM