我有这个代码将一些excel文件导入数据库。它需要花费太多时间,超过30秒,所以php在最大时间限制内向我发送错误。我不想禁用那个时间,也没有把更多时间花在php(set_timeout(0)
)上。对于20个注册表,它需要不到30秒,但我需要使用1000个注册表aprox:
public function importExcel(Request $request)
{
if($request->file('import_file')){
$path = $request->file('import_file')->getRealPath();
$data = Excel::load($path, function($reader) {
})->get()->toArray();
if(!empty($data) && (count($data)> 0)){
$errorCaga = false;
$array_errores = [];
foreach ($data as $key => $value) {
$r_ex_bases = AdminResolucionExenta::where('nombre',$value["r._ex._bases"])->pluck( 'id_resolucion_exenta')->first();
$decreto_precio_nudo = AdminDecretoPrecioNudo::where('nombre',$value["dec._p._nudo"])->pluck( 'id_decreto_precio_nudo')->first();
$modalidad = AdminModalidade::where('nombre',$value["modalidad"])->pluck( 'id_modalidad')->first();
$licitacion = AdminLicitacione::where('nombre',$value["licitacion"])->pluck( 'id_licitacion')->first();
$tipo_bloque = AdminTipoBloque::where('nombre',$value["tipo_bloque"])->pluck( 'id_tipo_bloque')->first();
$bloque = AdminBloque::where('nombre',$value["bloque"])->pluck( 'id_bloque')->first();
$distribuidora = AdminDistribuidora::where('nombre',$value["distribuidora"])->pluck( 'id_distribuidora')->first();
$punto_oferta = AdminPuntoOferta::where('nombre',$value["punto_oferta"])->pluck( 'id_punto_oferta')->first();
$punto_compra = AdminPuntoCompra::where('nombre',$value["punto_compra"])->pluck( 'id_punto_compra')->first();
$generadora = AdminGeneradora::where('nombre',$value["generadora"])->pluck( 'id_generadora')->first();
if(is_null($r_ex_bases) || is_null($decreto_precio_nudo) || is_null($modalidad) || is_null($licitacion) || is_null($tipo_bloque) || is_null($bloque) || is_null($distribuidora) || is_null($punto_oferta) || is_null($punto_compra) || is_null($generadora)){
array_push($array_errores,$value);
$errorCaga = true;
}else{
$datos = new AdminContrato;
$datos->resolucion_exenta_id = $r_ex_bases;
$datos->decreto_precio_nudo_id = $decreto_precio_nudo;
$datos->modalidad_id = $modalidad;
$datos->licitacion_id = $licitacion;
$datos->tipo_bloque_id = $tipo_bloque;
$datos->bloque_id = $bloque;
$datos->distribuidora_id = $distribuidora;
$datos->punto_oferta_id = $punto_oferta;
$datos->punto_compra_id = $punto_compra;
$datos->generadora_id = $generadora;
$datos->save();
}
}
//some more code to return and exit.
我怎么能更高效地做到这一点?我是Laravel的新手,我知道创建一个对象new AdminContrato
并不是最好的方法。 chunk()
方法会对此有所帮助吗?