在调用DB :: select时,为什么我会收到“连接已重置”消息?

时间:2018-04-17 15:03:42

标签: laravel postgresql laravel-5

在我的Laravel 5.5应用程序中,调用DB :: select在Postgresql数据库上运行select查询失败,而不显示Apache或Laravel错误日志中的任何错误,并触发“连接已重置”消息。此代码示例按预期运行,因为函数get_users_with_roles存在。

public function missing_function(Request $request) {
        try{
           $all = DB::select('SELECT * from get_users_with_roles()', []);
        }catch(Illuminate\Database\QueryException $qe){
            return json_encode($qe->getMessage());
        }
        return json_encode($all);
}

但是,如果我用不存在的函数替换该SQL字符串:

public function missing_function(Request $request) {
        try{
           $all = DB::select('SELECT * from test()', []);
        }catch(Illuminate\Database\QueryException $qe){
            return json_encode($qe->getMessage());
        }
        return json_encode($all);
}

重置连接,我在日志中看不到任何错误。如果我在本机Postgresql环境中运行此错误查询:

SELECT * from test();

我收到一条明确的错误消息:

    ERROR:  function test() does not exist
LINE 1: select * from test()
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

特别奇怪,因为这个问题并不一致。 try块有时会捕获QueryException并将Postgresql错误消息显示为例外。

我尝试过添加

php_flag xcache.cacher Off 
php_flag xcache.size 0 
php_flag xcache.stat Off

到.htaccess文件但无济于事。

我需要能够使用DB :: select方法,因为我在应用程序中严重依赖Postgresql用户定义的SQL和plpgsql函数。我有一个构造相关SQL的函数,并以编程方式将它传递给DB :: select方法,因此我需要能够捕获SQL中出现错误时抛出的异常,例如函数丢失时。

更新

这个问题似乎与DB :: select处理任何SQL错误的方式有关。我刚用一个存在但抛出SQL错误的函数尝试了这个。同样,不是允许我在PHP中使用try / catch块捕获它,而是重置连接,并且不会在Laravel日志或Apache日志中记录错误。

question没有任何消息。那里接受的答案是指预期的行为。在我的环境中,不会抛出或捕获QueryException。

2 个答案:

答案 0 :(得分:4)

这个棘手的部分是浏览器顽固拒绝透露任何形式的错误信息。当发生这种情况时,我喜欢转到命令行并尝试它,从而将Web服务器作为变量消除。

从聊天中,我们了解到命令行显示了预期的错误,但没有优雅地执行此操作:输出错误,并停止脚本。这是一次严重的崩溃,不属于网络服务器。

随着\Throwable的引入,PHP死硬的场景越来越少。因此,为了抓住PHP的垂死气息,我们实施了一个register_shutdown_functionerror_get_last,试图弄清楚在爆炸之前是什么,如果有的话。

这简要地揭示了浏览器中的错误消息(这次是使用不同的浏览器)。但是,这是不可重复的。此时的洞察力是缓存:composer dump-autoload解决了问题!

我怀疑发生了什么事:

  • Eloquent抛出异常
  • PHP正在通过Laravel的异常处理类冒泡它
  • 在某些时候,PHP试图加载一个不在自动加载器中的类
  • PHP崩溃(这是PHP 7.0保释的情况之一)

通过运行composer dump-autoload,所有"缺失"课程被带入自动加载器的权限,再次尝试时,正确的代码序列发生了。

答案 1 :(得分:-2)

我认为它是一个Sql查询错误

 `SELECT * from test()` 

因为()括号表示功能所以尝试使用

 `SELECT * from test` in your query 

laravel的最佳方式

使用php artisan make:model Test

创建模型

然后在控制器中使用

     `use App\Test;'

然后获取记录         Test::all(); 它将带来数据库中的所有记录,例如您的要求SELECT * from Test