【发布时间】:2016-03-09 18:05:18
【问题描述】:
我在 Laravel 上的数据库查询遇到了一个奇怪的问题。
我已经使用查询生成器实现了一个动态查询,使用获取参数。
我注意到某些查询非常慢,因此我开始调试从查询生成器生成的 sql,并使用 DB::select( $sql ) 使用原始 sql 语句执行查询。
我做了一些研究,我知道 n+1 问题,但事实并非如此,因为为了调试,我只是使用了带有 DB::select( $sql ) 的控制器操作,但它没有t 显示任何结果。它向我展示了:
代理错误
代理服务器收到来自上游服务器的无效响应。 代理服务器无法处理请求 GET /controller/action。
原因:从远程服务器读取错误
同样的查询,带有不需要大量数据库处理的参数,使用这种方法运行良好...
当我在 MySQL Workbench 上运行有问题的查询时,它们需要 5 到 10 秒才能显示结果。
在我的进一步调试中,我在操作中手动创建了一个 PDO 对象并执行了查询。令我惊讶的是,它的运行时间与 Workbench 相同。我在查询结果上使用了 hydrate 方法,对象在视图上渲染成功。
接下来,我尝试使用 Laravel 的 PDO 对象执行查询,并使用 DB::getPdo() 获取它。查询未处理,再次导致代理错误...
使用自定义 PDO 对象解决了这个问题,但我不喜欢创建 PDO 对象的想法,而不是使用 Laravel 的。
我不明白为什么会这样。它可以与数据库配置或 Laravel 的 PDO 对象相关吗?任何帮助表示赞赏!
【问题讨论】:
-
抛出代理错误需要多长时间,是运行查询通常需要 5-10 秒还是 30+ 秒?
-
大约需要 30+ 秒
-
那么可能是超时问题,因为脚本的默认 PHP
max_execution_time设置是 30 秒。 Laravel 的查询构建器在其内部使用的 PDO 之上引入了一些额外的复杂性,并且您的查询复杂性可能会产生过多的开销。您的查询似乎是问题的起点,所以我不知道是否有人可以在没有看到您实际尝试做什么的情况下提供相关建议。