我发现自己在工作中需要使用Windows服务器(2012) - 我从未遇到过建立数据库连接的问题,但现在我似乎找不到合适的解决方案。
我将向您展示我的连接PHP代码:
error_reporting(-1); ini_set('display_errors', 1); $DB = array ('dbname'=>"test" , 'user'=> '***' , 'passwort'=> '***', 'host'=>'somelocalnetwork ip 192.**'); $connect = "mysql:dbname=".$DB['dbname']."; host=".$DB['host']; try { $dbh = new PDO($connect,$DB['user'], $DB['passwort']); echo "Connection established.
"; $dbh = null; } catch (PDOException $e) { echo $e -> getMessage(); }
这是我在浏览器中的结果:
SQLSTATE [HY000] [2002] Es konnte keine Verbindung hergestellt werden,da der Zielcomputer die Verbindung verweigerte。
翻译成英文:
无法建立连接,因为目标计算机主动拒绝它。
注意: 我下载了mssql驱动程序和sqlsrv驱动程序并将它们解压缩到/ ext / direcoty,将它们包含在php ini文件中。 但是当检查php_info()时,我没有看到任何mssql或sqlsrv部分。 我不知道那是否相关
Windows Server设置为WebServer和普通Microsoft SQL Server
答案 0 :(得分:2)
使用sqlsrv连接到sql服务器:
<?php
error_reporting(E_ALL);
$serverName = "SuperComputer-PC";
$connectionInfo = array('Database'=>'RiverDatabase', "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if($conn) {
"Connection established.<br />";
}else {
"Connection could not be established.<br />";
die(print_r(sqlsrv_errors(), true));
}
?>
从以下位置下载php SQL Server: http://www.microsoft.com/en-za/download/details.aspx?id=20098
并将相关驱动程序复制到php ext文件夹。 将扩展添加到php.ini文件中,例如:
我使用的是5.4,但这应该适用于5.5,我不确定5.6是否存在驱动程序,但如果确实存在,那就太棒了。
答案 1 :(得分:-1)
可能是1)需要pc的授权或 2)端口号(机会较小)。
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = mysqli_connect($servername, $username, $password);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>
或尝试
try
{
if ($db = mysqli_connect($hostname_db, $username_db, $password_db))
{
//do something
}
else
{
throw new Exception('Unable to connect');
}
}
catch(Exception $e)
{
echo $e->getMessage();
}
对于连接问题:
如果这种情况总是发生,那么字面意思就是机器存在,但是没有服务在指定端口上侦听,或者有防火墙阻止你。
如果偶尔发生 - 您使用“有时”这个词 - 并且重试成功,很可能是因为服务器有一个完整的“积压”。
当您等待在侦听套接字上接受时,您将被置于待办事项中。这个积压是有限的而且非常短 - 值为1,2或3并不罕见 - 因此操作系统可能无法将您的'accept'请求排队。
backlog是listen函数的一个参数 - 所有语言和平台在这方面基本上都是相同的API,甚至是C#one。如果您控制服务器,此参数通常是可配置的,并且可能从某些设置文件或注册表中读取。研究如何配置服务器。
如果您编写了服务器,那么在接受套接字时可能需要进行大量处理,这可以更好地移动到单独的工作线程中,这样您的接受就可以随时接收连接。您可以探索各种架构选择,以减少排队客户端并按顺序处理它们。
无论您是否可以增加服务器积压,您都需要在客户端代码中重试逻辑以应对此问题 - 即使长时间积压,服务器可能在此时在该端口上接收了大量其他请求。
如果映射的端口耗尽,NAT路由器很少会出现此错误。我认为我们可以放弃这种可能性,因为路由器在耗尽之前有64K同时连接到相同的目标地址/端口。