无法在Windows Server 2012中建立与SQL的连接

时间:2015-03-11 09:43:15

标签: php sql sql-server pdo

我发现自己在工作中需要使用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

2 个答案:

答案 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文件中,例如: enter image description here

我使用的是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同时连接到相同的目标地址/端口。

相关问题