Laravel sqlsrv 在 tinker 模式下工作,但在浏览器中不工作

Laravel sqlsrv works in tinker mode but not in browser

我有一个 Laravel 5 项目(在 CentOS 7 机器上)连接到外部 MSSQL 数据库。

我使用 FreeTDS 遵循 here 概述的设置。

当我使用浏览器访问页面时出现错误:SQLSTATE[HY000] Unable to connect: Adaptive Server is unavailable or does not exist (severity 9)

但是当我使用 php artisan tinker 并执行类似 App\MyModel::get(); 的操作时,它 returns 一个带有 records/models 的 Illuminate\Database\Eloquent\Collection 实例就好了。

有人知道这有什么问题吗?

更新 我的 .env 如下所示:

SQLSRV_DB_DRIVER=sqlsrv
SQLSRV_DB_HOST=host.ip.address
SQLSRV_DB_DATABASE=my_db
SQLSRV_DB_USERNAME=my_username
SQLSRV_DB_PASSWORD=my_password

我的 config/database.php 看起来像:

'sqlsrv' => [
        'driver'   => env('SQLSRV_DB_DRIVER'),
        'host'     => env('SQLSRV_DB_HOST'),
        'database' => env('SQLSRV_DB_DATABASE'),
        'username' => env('SQLSRV_DB_USERNAME'),
        'password' => env('SQLSRV_DB_PASSWORD'),
        'prefix'   => '',
];

我的模型指定了一个连接:protected $connection = 'sqlsrv';

我将 FreeTDS 与 unixODBC 结合使用。

事实证明这不是 Laravel 问题而是 SELinux 问题。我通过以下 this guide 禁用了 SELinux,然后我能够在浏览器中访问我的项目。

我知道这不是最好的解决方案,但它适合我的目的。

SELinux 正在阻止您与 MSSQL 的传出连接。

正确的解决方案是允许 apache 建立连接:

setsebool -P httpd_can_network_connect_db 1

-P 标志使规则持久化,否则规则在重启后丢失。