Laravel 5.4数据库驱动缺失:API路由无法加载SQL Server驱动
刚接触Laravel遇到这种环境配置问题太正常了,咱们一步步排查解决:
1. 先清除配置缓存,排除缓存坑
Laravel的配置缓存很容易导致新添加的数据库连接配置不生效,尤其是你刚配置完SQL Server连接的情况。先运行这条命令清除配置缓存:
php artisan config:clear
清除后再测试API路由,看看是否解决问题。
2. 确认API代码明确指定了SQL Server连接
虽然Web路由没问题,但还是要确保API里的代码是明确使用SQL Server连接名,而非默认的MySQL连接:
// 正确写法:指定SQL Server连接 $data = DB::connection('sqlsrv')->select('SELECT * FROM your_target_table');
这里的sqlsrv要和你在config/database.php里定义的SQL Server连接的键名完全一致。
3. 检查Web和API请求的PHP环境是否一致
有时候Web服务器(比如Apache)和处理API请求的PHP-FPM会使用不同的php.ini配置,导致ODBC扩展只在Web环境加载,API环境没加载。
可以分别在Web和API路由里加测试代码,对比两者的扩展加载情况:
// Web路由添加测试接口 Route::get('/phpinfo', function() { phpinfo(); }); // API路由添加测试接口 Route::get('/api/phpinfo', function() { phpinfo(); });
访问这两个地址,搜索「ODBC」「SQL Server」相关的扩展条目,看看API环境里是否有对应的扩展加载。如果没有,需要修改API对应的PHP环境的php.ini,启用php_odbc.dll(Windows)或odbc.so(Linux)扩展,然后重启PHP-FPM/服务器。
4. 手动在API请求初始化时加载驱动
如果上面的方法都没解决,可以尝试在API中间件里提前初始化SQL Server连接,强制加载驱动:
首先在app/Http/Kernel.php的api中间件组里添加自定义中间件:
protected $middlewareGroups = [ 'api' => [ 'throttle:60,1', 'bindings', \App\Http\Middleware\LoadSqlServerDriver::class, // 新增这一行 ], ];
然后创建这个中间件文件app/Http/Middleware/LoadSqlServerDriver.php:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\DB; class LoadSqlServerDriver { public function handle($request, Closure $next) { // 提前初始化SQL Server连接,确保驱动被加载 try { DB::connection('sqlsrv')->getPdo(); } catch (\Exception $e) { throw $e; } return $next($request); } }
这样每个API请求进来时,都会提前触发SQL Server连接的初始化,强制加载对应的ODBC驱动。
内容的提问来源于stack exchange,提问作者user3313446

