我正在运行一个命令,该命令应该运行Laravel Excel导入,但是过一会儿就会用尽。我正在使用块,并且以前可以使用,但是现在我正在努力使其正常运行。这是一组文件,它们位于文件系统内的文件夹中。
这是我与工匠一起运行的命令:
public function handle()
{
//
$directory = 'pv';
$files = Storage::allFiles($directory);
\Log::info('Process started.');
$start = microtime(true);
ini_set('max_execution_time', 600);
foreach($files as $file)
{
$fname = basename($file);
\Log::info('Processing',[$fname]);
$arr = explode(" ", $fname);
$day = substr($arr[2], 0, 10);
$date = Carbon::parse($day);
Excel::queueImport(new POSImport($date), $file);
}
$time = microtime(true) - $start;
$me = 'me@mail.com';
$msg = 'Process finished in '. $time.' secs.';
Mail::to($me)->queue(new TasksFinished($msg));
$this->call('calcular:previos', [
'--queue' => 'default'
]);
}
它内存不足了。
这是导入。
<?php
namespace App\Imports;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Pos;
use App\Device;
use \Datetime;
class POSImport implements ToCollection, WithHeadingRow, WithChunkReading, ShouldQueue
{
public $tries = 3;
function __construct(Datetime $date) {
$this->date = $date;
}
/**
* Importa datos de la planilla de puntos vigentes de Banco Estado.
*
* Actúa sobre Device (equipos) y POS
*
* @param Collection $rows
*/
public function collection(Collection $rows)
{
//
ini_set('max_execution_time', 600);
foreach($rows as $row)
{
// crea o modifica POS
if(!isset($row['marca'])) {
return null;
}
// Busca el POS (lugar) en la base
$pos = Pos::where('id', $row['pos'])->first();
// si no hay un "pos" registrado lo crea
if(!$pos) {
$pos = new Pos;
$pos->id = $row['pos'];
$pos->vigente = ($row['estado'] == 'VIGENTE' ? true : false);
$pos->save();
} else {
$pos->vigente = ($row['estado'] == 'VIGENTE' ? true : false);
$pos->save();
}
// limpia serial de ceros a la izquierda
$serial = ltrim($row['serie_equipo'], '0');
// busca serial en la base de datos
$device = Device::where('serial', $serial)
->where('fecha_recepcion', '<', $this->date)
->where('customer_id', 1)
->orderBy('fecha_recepcion', 'asc')
->first();
if($device && $device->pos_id != $row['pos'] && $device->fecha_instalacion != $this->date){
// busca el dispositivo anterior
$device->pos_id = $pos->id;
$device->fecha_instalacion = $this->date;
$device->save();
$device->pos()->attach($pos);
}
}
}
public function chunkSize(): int {
return 2000;
}
}
如您所见,我正在使用WithChunkReading和ShouldQueue。 过去,当我开始此过程时,它只是处理了块,但现在队列显示了很多QueueImport条目。
我正在使用数据库作为队列驱动程序。
我希望你能帮我这个忙。
命令错误:
Symfony\Component\Debug\Exception\FatalErrorException : Allowed memory size of 536870912 bytes exhausted (tried to allocate 175747072 bytes)
at C:\laragon\www\reportes\vendor\laravel\framework\src\Illuminate\Queue\Queue.php:138
134|
135| return array_merge($payload, [
136| 'data' => [
137| 'commandName' => get_class($job),
> 138| 'command' => serialize(clone $job),
139| ],
140| ]);
141| }
142|
Whoops\Exception\ErrorException : Allowed memory size of 536870912 bytes exhausted (tried to allocate 175747072 bytes)
at C:\laragon\www\reportes\vendor\laravel\framework\src\Illuminate\Queue\Queue.php:138
134|
135| return array_merge($payload, [
136| 'data' => [
137| 'commandName' => get_class($job),
> 138| 'command' => serialize(clone $job),
139| ],
140| ]);
141| }
142|
大量数据,这就是为什么我使用块和队列,但仍然存在这个问题。
答案 0 :(得分:0)
class POSImport implements ShouldQueue
{
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout = 120;
}
此外,如果您希望队列工作者增加超时时间,则可以使用--timeout
标志(我认为默认值为30秒):
php artisan queue:work --timeout=300
我对此不确定,但也可能有效:
$this->call('calcular:previos', [
'--queue' => 'default',
'--timeout' => '300'
]);