Laravel-Excel我的导入逻辑太慢了

时间:2017-11-13 14:40:16

标签: php laravel laravel-excel

我有这个代码将一些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()方法会对此有所帮助吗?

0 个答案:

没有答案