全部
我们的系统运行的是 Windows Server 2016,带有 IIS 10 和 PHP 7.1.16。脚本通过 ODBC 连接到 SQL Server 数据库。在正常情况下,它工作得很好,但是每周五都会出现业务高峰,因为人们都想在周末之前完成工作。时不时地,与数据库的连接会开始失败,但继续尝试最终会让你成功。
我的 Db 连接脚本如下(如果需要,该函数允许我轻松地动态建立新的连接,因为 SQL Server 要求在提交新查询之前关闭先前的语句):
<?php
include "config.inc.php";
function DBConnFactory()
{
return new PDO($dsn='odbc:Driver={SQL Server};Server='.DB_INST.';Database='.DB_DATABASE.';APP=WhatsMyAppAgain;Trusted_Connection='.DB_TRUST);
}
try
{
$db=DBConnFactory();
}
catch (Exception $e)
{
error_log($e->getMessage().' in '.$e->getFile().', on line '.$e->getLine());
die('Can\'t connect to the database!');
}
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// leave the ending tag off, otherwise you could get
// random whitespace that could block header changes.
当它开始失败时,我在日志中收到以下消息:
[19-Oct-2018 17:38:42 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0 in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:38:43 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0 in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:39:10 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0 in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:44:28 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0 in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:45:13 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0 in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:46:15 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0 in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
[19-Oct-2018 17:48:25 Australia/Sydney] SQLSTATE[] SQLDriverConnect: 0 in C:\inetpub\wwwroot\WhatsMyAppAgain\LIVE\dbconn.inc.php, on line 7
事件查看器中没有任何错误提供任何线索来判断发生了什么。我知道问题不在于 SQL 服务器,因为我的开发环境连接到同一个 SQL 服务器,但我没有看到那里的问题,而且当问题影响 LIVE 环境时,QA 环境(位于同一台服务器上)也会受到影响。
我已经创建了可以通过同一个 ODBC 创建任意数量连接的存根脚本,但是即使我创建了 3,000 个连接(远远超出了网站在每个人都试图同时跳转的情况下所创建的连接数量),我仍无法重现这种情况。
答案1
我已经用这个替换了微软的 PDO SQL Server 驱动程序从此以后我们就没再遇到过任何问题。