我有一个使用SQL Server和PDO在IIS上运行的简单PHP应用程序,我在Windows 8.1的Windows计算机上本地运行。
我发现,如果计算机放置很长一段时间,然后我访问应用程序,有时会出现以下错误:
〔04-Apr-2016 13:57:33欧洲/都柏林〕PHP致命错误:未捕获异常"PDOException",消息为"SQLSTATE〔28000〕:〔Microsoft〕〔ODBC Driver 11 for SQL Server〕〔SQL Server〕用户"username"登录失败在C:''Application''web''api''helpers''DB.php:21中堆栈跟踪:#0 C:''Application''web''api''helpers''DB.php(21):PDO->__construct('sqlsrv:server=L..','用户名','密码')#1 C:''Application''web''api''helpers''DB.php(14):DB->__construct()#2 C:''Application''web''api''controllers''App.php(309):DB::getInstance()#3 C:''Application''web''api''index.php(49):App::ListAppWithMedia()#4{main}在第21行的C:''Application''web''api''helpers''DB.php中抛出
如果我刷新页面,效果会很好!从错误的外观来看,它似乎无法连接到数据库。。。有什么想法可以引起这种情况吗?我知道IIS可以闲置并重新启动以节省资源,但为什么它会在SQL Server上失败?然后自己刷新?
DB.php的内容是:
class DB
{
private $connection;
private static $instance = NULL;
public static function getInstance()
{
if (self::$instance === NULL)
self::$instance = new self();
return static::$instance;
}
private function __construct()
{
$this->connection = new PDO("sqlsrv:server=".SERVER.";Database=".DATABASE, UID, PWD);
}
public function query($query, $params = null)
{
$q = $this->connection->prepare($query);
$execute = $q->execute($params);
return $q;
}
}
下面是一个如何使用这个类的例子:
class App
{
public static function ListAppWithMedia()
{
$sql = "SELECT * FROM Applications";
$query = DB::getInstance()->query($sql);
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
return $rows;
}
}
除非电脑闲置几个小时,否则一切正常。
Create a PDO instance and set the error mode
<?php
$dsn = 'mysql:dbname=test;host=localhost';
$user = 'user';
$password = 'pass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>