You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shopware 6应用中注册cronjob与定时任务?

在Shopware 6应用中注册定时任务(Scheduled Task)

完全可以在Shopware 6应用中注册定时任务来处理店铺数据,以下是具体实现步骤:

1. 创建定时任务类

首先定义一个继承自ScheduledTask的任务类,声明任务的基本标识和执行规则:

<?php

namespace YourPluginNamespace\ScheduledTask;

use Shopware\Core\Framework\MessageQueue\ScheduledTask\ScheduledTask;

class StoreDataProcessingTask extends ScheduledTask
{
    // 任务全局唯一名称
    public static function getTaskName(): string
    {
        return 'your_plugin.store_data_processing';
    }

    // 默认执行间隔(单位:秒,示例为1小时)
    public static function getDefaultInterval(): int
    {
        return 3600;
    }

    // 可选:设置为单例任务,避免同一时间重复执行
    public static function isSingleton(): bool
    {
        return true;
    }
}

2. 编写任务处理器

创建任务处理器类,继承ScheduledTaskHandler并实现具体的数据处理逻辑,可遍历所有店铺进行针对性处理:

<?php

namespace YourPluginNamespace\ScheduledTask;

use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\MessageQueue\ScheduledTask\ScheduledTaskHandler;
use Shopware\Core\System\SalesChannel\SalesChannelRepository;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;

#[AsMessageHandler]
class StoreDataProcessingTaskHandler extends ScheduledTaskHandler
{
    private SalesChannelRepository $salesChannelRepository;

    public function __construct(SalesChannelRepository $salesChannelRepository)
    {
        $this->salesChannelRepository = $salesChannelRepository;
    }

    public function run(StoreDataProcessingTask $task, Context $context): void
    {
        // 获取所有店铺(销售渠道)
        $salesChannels = $this->salesChannelRepository->search(new \Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria(), $context);
        
        // 遍历每个店铺执行数据处理逻辑
        foreach ($salesChannels as $channel) {
            $channelId = $channel->getId();
            $channelName = $channel->getName();
            
            // 在这里编写针对单个店铺的业务逻辑
            // 例如:同步第三方数据、生成店铺报表、清理冗余数据等
        }
    }

    // 指定当前处理器关联的任务类
    public static function getHandledMessages(): iterable
    {
        return [StoreDataProcessingTask::class];
    }
}

3. 注册服务到DI容器

在插件的services.yaml文件中注册任务类和处理器:

services:
    YourPluginNamespace\ScheduledTask\StoreDataProcessingTask:
        tags:
            - name: shopware.scheduled.task

    YourPluginNamespace\ScheduledTask\StoreDataProcessingTaskHandler:
        arguments:
            - '@sales_channel.repository'
        tags:
            - name: messenger.message_handler

4. 激活并启用任务

  • 手动启用:插件安装完成后,进入Shopware后台「设置 > 系统 > 定时任务」,找到你定义的任务并点击启用。
  • 自动激活:若希望插件安装时自动创建并启用任务,可在插件的activate方法中添加逻辑:
<?php

namespace YourPluginNamespace;

use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\MessageQueue\ScheduledTask\ScheduledTaskDefinition;
use YourPluginNamespace\ScheduledTask\StoreDataProcessingTask;

class YourPlugin extends Plugin
{
    public function activate(ActivateContext $context): void
    {
        parent::activate($context);
        
        $taskRepository = $this->container->get('scheduled_task.repository');
        $internalContext = $context->getContext();
        
        // 检查任务是否已存在
        $taskExists = $taskRepository->search(new Criteria([StoreDataProcessingTask::getTaskName()]), $internalContext)->count() > 0;
        
        if (!$taskExists) {
            $taskRepository->create([
                [
                    'name' => StoreDataProcessingTask::getTaskName(),
                    'task' => StoreDataProcessingTask::class,
                    'interval' => StoreDataProcessingTask::getDefaultInterval(),
                    'status' => ScheduledTaskDefinition::STATUS_ENABLED,
                ]
            ], $internalContext);
        }
    }
}

注意事项

  • 定时任务依赖Shopware消息队列,需确保服务器运行定时任务队列的worker进程,执行命令:bin/console messenger:consume scheduled_task -vv
  • 若需针对不同店铺设置不同执行间隔,可在创建任务实例时动态调整interval字段,或在处理器内根据店铺属性做逻辑分支
  • 任务名称必须全局唯一,建议添加插件前缀避免冲突

内容的提问来源于stack exchange,提问作者Cuong Huynh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:23:17