php - 在关闭函数中捕获异常

标签 php exception error-handling zend-db shutdown

我正在处理一些需要获取数据库资源的 PHP 代码,在运行期间将其标记为已锁定,并在完成后将其标记为未锁定。锁是在启动时通过更新表中的值获得的,我已经注册了一个关闭函数以在脚本因任何原因终止时释放锁。

我遇到的问题是与服务器(Microsoft SQL 数据库服务器)的连接在实时环境中似乎不是很可靠,这似乎是异常脚本终止的常见原因。显然,当我未连接时我无法解锁数据库资源,但我至少希望能够干净利落地处理失败。

以下是主要脚本的大幅缩减版本。

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;
}

我的关机函数是这样的:

$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);

我期待在连接丢失的情况下,脚本尝试释放数据库锁但失败了,并回显有关无法释放锁的消息。

然而,我实际得到的是:

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

我试图找到关于是否可以在关闭函数中捕获异常的明确答案,但到目前为止运气不佳,所以我仍在寻找。但是,如果可以在关闭函数中处理异常,我会很高兴知道我正在应用的方法有什么问题。

最佳答案

我刚刚用一个简单的代码对此进行了测试,在关闭功能之前我没有断开连接。

<?    
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

关于php - 在关闭函数中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092600/

相关文章:

python - 而无限循环python

php - Elasticsearch:避免在结果集中返回 “sort”值

php - Javascript 和 PHP5 中的换行符

android - 无法加载 android 套接字类 java.lang.NoSuchMethodException : com. android.org.conscrypt.OpenSSLSocketImpl.setUseSessionTickets [boolean]

c++ - 在不直接修改地址的情况下执行地址时引发异常

php - file_put_contents错误

php - 基于第二个数组过滤数组

php - Symfony 4 安装没有 "public"文件夹。只有 "vendor/"。(无法打开输入文件 : bin/console)

c# - 使用 DropNet 的异常

离开页面时 JQuery Ajax 错误