setName('emergency:gift_queue')
->setDescription('紧急处理积压送礼队列')
->addOption('limit', 'l', Option::VALUE_OPTIONAL, '最大处理数量', 10000)
->addOption('batch-size', 'b', Option::VALUE_OPTIONAL, '每批处理数量', 500)
->addOption('concurrent', 'c', Option::VALUE_OPTIONAL, '并发进程数', 1);
}
protected function execute(Input $input, Output $output)
{
$limit = $input->getOption('limit');
$batchSize = $input->getOption('batch-size');
$concurrent = $input->getOption('concurrent');
$output->writeln("开始紧急处理积压送礼队列...");
$output->writeln("最大处理: {$limit}, 批量大小: {$batchSize}, 并发数: {$concurrent}");
if ($concurrent > 1) {
// 多进程处理
$this->multiProcess($output, $limit, $batchSize, $concurrent);
} else {
// 单进程处理
$result = GiftQueue::emergencyProcess($limit, $batchSize);
$this->outputResult($output, $result);
}
}
protected function multiProcess($output, $limit, $batchSize, $concurrent)
{
$perProcess = ceil($limit / $concurrent);
$output->writeln("每个进程处理: {$perProcess}条");
$pids = [];
for ($i = 0; $i < $concurrent; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
$output->writeln("创建子进程失败");
exit(1);
} elseif ($pid == 0) {
// 子进程
$result = GiftQueue::emergencyProcess($perProcess, $batchSize);
$output->writeln("子进程 {$i} 完成: " . json_encode($result));
exit(0);
} else {
// 父进程
$pids[] = $pid;
$output->writeln("启动子进程 {$i}, PID: {$pid}");
}
}
// 等待所有子进程完成
foreach ($pids as $pid) {
pcntl_waitpid($pid, $status);
$output->writeln("子进程 {$pid} 已完成");
}
// 输出最终统计
$finalSize = GiftQueue::size();
$output->writeln("所有进程处理完成,剩余队列大小: {$finalSize}");
}
protected function outputResult($output, $result)
{
$output->writeln("处理结果:");
$output->writeln("总计处理: {$result['total_processed']}");
$output->writeln("成功: {$result['total_success']}");
$output->writeln("失败: {$result['total_failed']}");
$output->writeln("剩余队列大小: {$result['remaining']}");
if ($result['remaining'] > 0) {
$output->writeln("队列仍有积压,建议增加并发处理");
} else {
$output->writeln("队列积压已清理完成");
}
}
}