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)); // 添加 BOMif (empty($titles)) {$titles = $records-->first()->keys()->toArray();// Add CSV headersfputcsv($handle, $titles);unset($titles);}foreach ($records as $record) {if ($record) {fputcsv($handle, $this->getFormattedRecord($record));}}}// Close the output streamfclose($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('...') 调用
yufan个人站