我正在研究一些需要获取数据库资源的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致命错误:未捕获的异常'Zend_Db_Statement_Exception' 消息'SQLSTATE [HY000]:常规错误:20047 DBPROCESS已失效 或未启用[20047](严重性1)[(null)]'in 的Zend / DB /报表/ Pdo.php:238
我试图找到一个明确的答案,关于是否有可能在关机功能中捕捉异常,但到目前为止还没有多少运气,所以我还在寻找。但是,如果可以处理关闭函数中的异常,我会很高兴知道我正在应用的方法有什么问题。
答案 0 :(得分: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)(建于2013年8月23日08:41:45)版权所有(c)1997-2013 PHP Group Zend Engine v2.5.0,版权所有(c)1998-2013 Zend 技术