嗨,我正在使用
maatwebsite/excel:^3.1
包导出数据并将数据导出到 Excel,但出现 a 60 seconds exceeded
错误。
这是我的
export.php
代码
namespace App\Exports;
use App\Models\Produit;
use Illuminate\View\View;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
class ProductDataExport implements FromView, ShouldAutoSize
{
use Exportable;
private $products;
public function __construct() {
$this->products = Produit::all();
}
public function view() : View
{
return view('invoices-product',[
'products_list' => Produit::all()
]);
}
}
这是我的
Produitcontroller
文件:
public function exportProduct()
{
$product_list = Produit::all();
return Excel::download(new ProductDataExport, 'products-data.xlsx');
}
这是路线代码:
Route::post('products/export-excel',[ProduitController::class, 'exportProduct'])->name('products.download-excel');
这是我的表单操作:
<form action="{{ route('products.download-excel') }}" method="POST">
@csrf
<div>
<button type="submit" class="btn btn-success">
<div>Export Excel</div>
</button>
</div>
</form>
老实说,我没有尝试过任何事情,因为我不知道我做错了什么?
您遇到的 60 秒超时问题可能是由于获取和处理导出数据所需的时间造成的,尤其是在您拥有大型数据集的情况下。 Laravel Excel 包有时会面临大型数据集的性能问题。
以下是解决此问题的一些方法:
对数据进行分块:您可以对数据进行分块以分批处理,而不是使用 Produit::all() 一次获取所有记录。这可以减少内存使用和处理时间。具体方法如下:
public function __construct()
{
$this->products = Produit::chunk(100, function ($products) {
$this->products = $products;
});
}
在此示例中,chunk(100) 将批量获取 100 条记录。
将导出作业排队:如果导出操作花费的时间太长,您可以将其卸载到队列中。 Laravel 提供了一个强大的队列系统来异步处理耗时的任务。您可以将导出作业分派到队列以避免超时。您可以这样做: 首先,确保您已正确配置队列系统(例如,使用 Redis、数据库等)。
然后,修改您的导出函数以分派作业:
use App\Exports\ProductDataExport;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Excel;
use App\Http\Controllers\Controller;
class ProduitController extends Controller
{
public function exportProduct(Request $request)
{
$product_list = Produit::all();
dispatch(new ProductDataExport($product_list));
return redirect()->back()->with('success', 'Exporting products to Excel. You will be notified once the export is complete.');
}
}
修改您的出口类别以接受产品列表:
use App\Models\Produit;
use Illuminate\View\View;
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\Exportable;
class ProductDataExport implements FromView, ShouldAutoSize
{
use Exportable;
private $products;
public function __construct($products)
{
$this->products = $products;
}
public function view(): View
{
return view('invoices-product', [
'products_list' => $this->products
]);
}
}
优化数据库查询:确保您的数据库查询得到优化。必要时使用索引,并避免不必要的联接或可能减慢数据检索速度的复杂查询。 尝试这些方法,看看它们是否有助于解决超时问题。