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
标志使规则持久化,否则规则在重启后丢失。
我有一个 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
标志使规则持久化,否则规则在重启后丢失。