如何解决登录超时因 PDO sqlsrv 连接而过期能够从同一个 RHEL 8 客户端使用 TSQL 进行查询就好了
我通过以下连接尝试收到“登录超时已过期”:
$dbx = new PDO("sqlsrv:Server=RemoteSQLServer;Database=TheDatabase",SQL_USER,SQL_PW);
如果我添加 LoginTimeout:
$dbx = new PDO("sqlsrv:Server=RemoteSQLServer;Database=TheDatabase;LoginTimeout=60;",SQL_PW);
脚本返回错误网关错误。我不知所措,不确定我错过了什么。详情如下。
这是一个安装了 PHP 7.4.6 的 RHEL 8.3 系统。 RemoteSQLServer 是一个运行 SQLServer 2012 的远程 Windows 系统。我能够使用 php-mssql 从 RHEL 7 系统成功连接到这个实例(据我所知,这在 RHEL 8 中不可用)。
为了排除任何网络问题,我可以使用 RHEL 8 客户端中的 tsql
连接到 RemoteSQLServer,没有任何问题。
[user@rhel8client ~]# tsql -S RemoteSQLServer -U SQL_USER
Password:
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> select getdate();
2> go
Apr 19 2021 08:32:06:467PM
(1 row affected)
1> quit
[user@rhel8client ~]#
相关phpinfo详情:
[user@rhel8client ~]# php -i | grep sqlsrv
/etc/php.d/20-sqlsrv.ini,/etc/php.d/30-pdo_sqlsrv.ini,/etc/php.d/30-sqlsrv.ini,Registered PHP Streams => https,ftps,compress.zlib,php,file,glob,data,http,ftp,compress.bzip2,phar,sqlsrv
PDO drivers => mysql,sqlite,sqlsrv
pdo_sqlsrv
pdo_sqlsrv support => enabled
pdo_sqlsrv.client_buffer_max_kb_size => 10240 => 10240
pdo_sqlsrv.log_severity => 0 => 0
pdo_sqlsrv.report_additional_errors => 1 => 1
pdo_sqlsrv.set_locale_info => 2 => 2
sqlsrv
sqlsrv support => enabled
sqlsrv.ClientBufferMaxKBSize => 10240 => 10240
sqlsrv.LogSeverity => 0 => 0
sqlsrv.LogSubsystems => 0 => 0
sqlsrv.SetLocaleInfo => 2 => 2
sqlsrv.WarningsReturnAsErrors => On => On
上面的ini文件:
[user@rhel8client ~]# cat /etc/php.d/20-sqlsrv.ini
extension=sqlsrv.so
[user@rhel8client ~]# cat /etc/php.d/30-sqlsrv.ini
extension=sqlsrv.so
[user@rhel8client ~]# cat /etc/php.d/30-pdo_sqlsrv.ini
extension=sqlsrv.so
相关安装包:
[user@rhel8client ~]# yum list installed | grep msodb
msodbcsql17.x86_64 17.7.2.1-1 @System
[user@rhel8client ~]# yum list installed | grep ODBC
unixODBC.x86_64 2.3.7-1.el8 @rhel-8-for-x86_64-appstream-rpms
unixODBC-devel.x86_64 2.3.7-1.el8 @rhel-8-for-x86_64-appstream-rpms
[user@rhel8client ~]# pecl list
Installed packages,channel pecl.php.net:
=========================================
Package Version State
pdo_sqlsrv 5.9.0 stable
sqlsrv 5.9.0 stable
这个 post from 2019 提出了一个类似的问题,但唯一的答案似乎没有详细说明安装他们列出的软件包后要做什么(我已经做了很多,见上文)。
我不确定我还需要在这里做什么。
有没有办法让PDO使用tsql?
解决方法
我终于想出了如何从 RHEL8 机器到运行 SQL Server 2012 的 Windows 系统建立工作连接。这个 how-to 很有帮助。
首先安装几个需要的包
sudo dnf install php-odbc freetds freetds-devel
转到您的 SQL Server 2012 机器并获取这些变量:
SELECT @@servername AS 'Server Name'; # MYSERVERNAME
SELECT @@servicename AS 'Instance Name'; # MSSQLSERVER
从提示中发出此问题以获取 libtdsodbc.so.0
路径
ldconfig -p | grep libtdsodbc
[user@rhel8 ~]# ldconfig -p | grep libtdsodbc
-> libtdsodbc.so.0 (libc6,x86-64) => /lib64/libtdsodbc.so.0
libtdsodbc.so (libc6,x86-64) => /lib64/libtdsodbc.so
编辑 /etc/odbcinst.ini
并将 FreeTDS
部分更改为以下内容:
[FreeTDS]
Description = FreeTDS Driver
Driver = /lib64/libtdsodbc.so.0
# save & exit
Edit /etc/odbc.ini
-- 这个 ini 文件定义了 DSN。注意开头可能是空白的,没关系
[ArbitraryServerID]
Description = AppDatabase database on MYSERVERNAME
Driver = FreeTDS
Database = AppDatabase
ServerName = ArbitraryServerID
TDS_Version = 8.0
# save and exit
注意:“ArbitraryServerID”可以是任何字符串 - 只需在所有配置中一致使用它
编辑 /etc/freetds.conf
以添加以下部分
[ArbitraryServerID]
host = mysqlserver.example.com
# host = 1.2.3.4
instance = MYSQLSERVER
port = 1433
tds version = 8.0
text size = 64512
client charset = UTF-8
现在可以使用 isql 测试连接
isql -S ArbitraryServerID -U 'username' -P 'password'
假设一切正常,重启php-fpm
service php-fpm restart
在您的 PHP 应用程序中,PDO 连接字符串应类似于:
$mssql_server = 'ArbitraryServerID';
$mssql_user = 'username';
$mssql_pw = 'password';
$dbx_mssql = new PDO("odbc:DRIVER=FreeTDS;SERVERNAME=$mssql_server;Database=AppDatabase",$mssql_user,$mssql_pw);
就是这样,您现在可以使用 ODBC 连接到远程 SQLServer 实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。