Laravel for 循环中的 findOrFail 导致的数据库查询问题
Laravel DB Query issues caused by findOrFail in for loop
我的应用程序处理数以千计的数据库条目,并允许用户导出搜索结果列表的特定部分。
每个 Entry
都包含特定文件,用户希望以压缩文件(例如 zip)的形式下载它们。这工作正常,但我 运行 很可能进入 最大执行超时 。出于调试的原因,我尝试在我的 php 脚本中简单地调整 PHP 的 max_execution_time
。两者都没有遗漏错误。
基本上我有两个问题:
- 如何正确分析问题? (是否与最大执行时间有关)
- 如何省略最大执行超时? (很可能是这样,因为查询量较小时它工作得很好)
示例代码:
public function export(Requests\ExportRequest $request)
{
$input = $request->all();
foreach ($input['entries'] as $id) {
$entry = Entry::findOrFail($id);
}
}
编辑:
Fyi,问题不在于 max_execution_time
,即使它确实大量减少了 SQL 查询。问题是由 max_input_vars
的限制引起的。目标条目在表单中检查并发送到 export() 函数。每个复选框都有 name=entries[]
,这导致每个条目都有一个单独的输入值。您可以在此处阅读有关此问题的更多信息:Is there a limit on checked checkboxes in PHP form POST? (Consider also reading this specific answer)
您 运行 遇到了 N+1 问题:您对要接收的每个条目执行单独的查询。您可以通过编写查询来一次检索所有条目。我不完全知道在您发布代码之后会发生什么,因为发布的代码实际上并没有做任何事情。但是 运行ning 1000 个单独的查询比 运行ning 1 个大查询慢几个数量级。
public function export(Requests\ExportRequest $request)
{
$input = $request->all();
$allEntries = Entry::whereIn('entry_id', $input['entries'])->get();
// All entries is a Collection with all the queried entries in it
}
我的经验法则是,每当 max_execution_time
发挥作用时,我就做出了错误的架构决定。也许我的解决方案解决了问题,也许@TheFallen 解决了问题。但是我们需要更多的代码来分析它。
我的应用程序处理数以千计的数据库条目,并允许用户导出搜索结果列表的特定部分。
每个 Entry
都包含特定文件,用户希望以压缩文件(例如 zip)的形式下载它们。这工作正常,但我 运行 很可能进入 最大执行超时 。出于调试的原因,我尝试在我的 php 脚本中简单地调整 PHP 的 max_execution_time
。两者都没有遗漏错误。
基本上我有两个问题:
- 如何正确分析问题? (是否与最大执行时间有关)
- 如何省略最大执行超时? (很可能是这样,因为查询量较小时它工作得很好)
示例代码:
public function export(Requests\ExportRequest $request)
{
$input = $request->all();
foreach ($input['entries'] as $id) {
$entry = Entry::findOrFail($id);
}
}
编辑:
Fyi,问题不在于 max_execution_time
,即使它确实大量减少了 SQL 查询。问题是由 max_input_vars
的限制引起的。目标条目在表单中检查并发送到 export() 函数。每个复选框都有 name=entries[]
,这导致每个条目都有一个单独的输入值。您可以在此处阅读有关此问题的更多信息:Is there a limit on checked checkboxes in PHP form POST? (Consider also reading this specific answer)
您 运行 遇到了 N+1 问题:您对要接收的每个条目执行单独的查询。您可以通过编写查询来一次检索所有条目。我不完全知道在您发布代码之后会发生什么,因为发布的代码实际上并没有做任何事情。但是 运行ning 1000 个单独的查询比 运行ning 1 个大查询慢几个数量级。
public function export(Requests\ExportRequest $request)
{
$input = $request->all();
$allEntries = Entry::whereIn('entry_id', $input['entries'])->get();
// All entries is a Collection with all the queried entries in it
}
我的经验法则是,每当 max_execution_time
发挥作用时,我就做出了错误的架构决定。也许我的解决方案解决了问题,也许@TheFallen 解决了问题。但是我们需要更多的代码来分析它。