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

时间:2016-04-04 13:20:12

标签: php sql-server pdo

我使用SQL Server和PDO在IIS上运行一个简单的PHP应用程序,我在Windows 8.1的Windows机器上运行本地

我发现的是,如果计算机长时间停留然后我访问该应用程序,我有时会收到以下错误:

  

[04-Apr-2016 13:57:33 Europe / Dublin] PHP致命错误:未捕获异常' PDOException'消息' SQLSTATE [28000]:[Microsoft] [SQL Server的ODBC驱动程序11] [SQL Server]用户'用户名'登录失败。'在C:\ Application \ web \ api \ helpers \ DB.php中:21       堆栈跟踪:       #0 C:\ Application \ web \ api \ helpers \ DB.php(21):PDO-> __ construct(' sqlsrv:server = L ...',' username&#39 ;,'密码')       #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;
    }
}

除非计算机闲置几个小时,否则一切正常。

1 个答案:

答案 0 :(得分:1)

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

    ?>