PHP PDO登录在长时间处于非活动状态时失败


PHP PDO Login fails when inactive for long periods

我有一个使用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();
    }
    ?>