Laravel 使用Laravels问题解决
2022-01-11 08:51 / 浏览量:1449

1.确保Laravel5.8以上支持 streamDownload ,swoole限制exit,导出需使用

streamDownload 下载。

以laravel-admin为例



//新增类继承-Encore\Admin\Grid// 增加导出处理请求/** * Handle export request. * * @param bool $forceExport */  public function handleExportResponse($forceExport = false){      if (!$scope = request(\Encore\Admin\Grid\Exporter::$queryName)) {          return;      }
      // 这段隐藏,防止与laravels冲突      // clear output buffer.      // if (ob_get_length()) {      //     ob_end_clean();      // }
     $this->disablePagination();
     if ($forceExport) {          //返回Response,export方法中为response()->streamDownload导出逻辑          return $this->getExporter($scope)->export();      }  }


//grid 为新增类实例
public function index(Content $content){        
 $grid = $this->grid();        // 导出前置为response        
 if (request(\Encore\Admin\Grid\Exporter::$queryName)) {          
  return $grid->handleExportResponse(true);        
 }        
 return $content->title($this->title())            
  ->description($this->description['index'] ?? trans('admin.list'))            
  ->body($grid);    
}


use Encore\Admin\Grid\Exporters\AbstractExporter;class CsvExporter extends AbstractExporter{  /**   * @var array $columns   */  private $columns = [];  /**   * 默认移除的key   *   * @var array   */  protected $defaultForgetKeys = [    "devel",    "thumb",    "sort",    "images",    "image",    "icon",    "logo",    "deleted_at",    "top_subject_id",    "subject_id",  ];  /**   * 只支持数据库字段是json类型的在此设置.   *   *   * 部分数据以json形式保存在数据库,默认会转成数组,数组的key会当做列名做导出处理,所以在此排除.   *   * @var array   */  public $ignore2Array = [];  /**   * @inheritDoc   */  public function headings(): array{    if (!empty($this->columns)) {      return $this->columns;    }
   $exclusions = collect($this->defaultForgetKeys)->map(static function ($exclusion) {      return Str::snake($exclusion);    });
   $this->columns = $this->grid->visibleColumns()->mapWithKeys(static function (Column $column) {      return [$column->getName() => $column->getLabel()];    })->except($exclusions);
   return $this->columns->toArray();  }  /**   * @inheritDoc   */  public function collection(){    $lists = [];    $this->grid->build();    /**     * @var Row $row     */    // Log::info($this->columns);    foreach ($this->grid->rows() as $row) {      $data = [];      foreach ($this->columns as $key => $column) {        $data[$column] = trim(strip_tags(preg_replace(          /** @lang text */          '/(.*)>,          '',          $row->column($key)        )));      }      $lists[] = $data;    }
   return new Collection($lists);  }
   public function getFileName($extension = ""){        $tableName = $this->getTable();        $now = date('Y-m-d H:i:s');
       //        return admin_trans("table.".$tableName)."_".$now."_".substr(time(), 5).$extension;        return admin_trans("table." . $tableName) . "_" . $now . $extension;    }  public function getHeaders($filename){    return [      'Content-Encoding'    => 'UTF-8',      'Content-Type'        => 'application/csv;charset=UTF-8',      // 'Content-Type'        => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8',      'Content-Disposition' => "attachment; filename=\"$filename\"",      'Cache-Control' => 'max-age=0'    ];  }  /**   * {@inheritdoc}   */  public function export(){    if (!ini_get('safe_mode')) {      set_time_limit(60 * 60 * 5);    }    $fileName = $this->getFileName(".csv");    $headers = $this->getHeaders($fileName);    $this->headings();    $records = $this->collection();
   $response = response()->streamDownload(function () use ($records) {      $handle = fopen('php://output', 'w');      $titles = [];
     if ($records && count($records) > 0) {        fwrite($handle, chr(0xEF) . chr(0xBB) . chr(0xBF)); // 添加 BOM        if (empty($titles)) {          $titles = $records-->first()->keys()->toArray();
         // Add CSV headers          fputcsv($handle, $titles);          unset($titles);        }
       foreach ($records as $record) {          if ($record) {            fputcsv($handle, $this->getFormattedRecord($record));          }        }      }      // Close the output stream      fclose($handle);    }, $fileName, $headers);
   if (!config("admin.swoole")) {      $response->send();      exit();    } else {      return $response;    }  }
}


2.防止内存泄漏,执行

compose install --no-dev

主要是Log报错记录显示包,不断增加记录

3.清除重载实例



'cleaners' => [ 
  \Hhxsv5\LaravelS\Illuminate\Cleaners\AuthCleaner::class,
  \Hhxsv5\LaravelS\Illuminate\Cleaners\SessionCleaner::class,
  Hhxsv5\LaravelS\Illuminate\Cleaners\LaravelAdminCleaner::class,
  \Hhxsv5\LaravelS\Illuminate\Cleaners\RequestCleaner::class,    
],


4.登录冲突

有swoole预载机制,需重新注册支持



'register_providers' => [        
 /* middleware service providers */        
 Dingo\Api\Provider\DingoServiceProvider::class,        
 Dingo\Api\Provider\HttpServiceProvider::class,        
 /* auth service providers */        
 Illuminate\Auth\AuthServiceProvider::class,        
 App\Providers\AuthServiceProvider::class,        
 Tymon\JWTAuth\Providers\LaravelServiceProvider::class,    
],


5.文件上传处理

$_FILES 改用 $request->file('...') 调用