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

安装Shopware插件后如何重启Worker加载新代码?

解决Shopware插件安装后自动重启Supervisor Worker的方案

问题背景

插件安装后,Supervisor管理的Shopware消息队列Worker未加载新插件的定时任务代码,导致控制台出现Error thrown while handling message ...\ScheduledTask\Task. Sending for retry #3 using 4000 ms delay. Error: "No handler for message "...\ScheduledTask\Task"."报错,核心需求是实现插件安装/激活后自动重启Worker以加载最新代码。

可行实现方案

1. 利用Shopware插件生命周期事件触发重启

Shopware提供插件安装、激活的生命周期钩子,可在插件核心类中监听对应事件,执行Worker重启操作。

代码示例

在插件的src/[YourPluginName].php中添加逻辑:

use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Symfony\Component\Process\Process;

class YourPluginName extends Plugin
{
    public function install(InstallContext $context): void
    {
        parent::install($context);
        $this->restartSupervisorWorker();
    }

    public function activate(ActivateContext $context): void
    {
        parent::activate($context);
        $this->restartSupervisorWorker();
    }

    private function restartSupervisorWorker(): void
    {
        // 替换为你的Supervisor进程组名或Worker名称
        $process = new Process(['supervisorctl', 'restart', 'shopware-worker:*']);
        $process->run();

        // 可选:记录命令执行异常
        if (!$process->isSuccessful()) {
            error_log('Worker重启失败: ' . $process->getErrorOutput());
        }
    }
}

2. 配置Supervisor权限

运行Shopware的Web服务器用户(如www-data)需要拥有执行supervisorctl的权限,可通过sudoers规则配置:

  • 在/etc/sudoers.d/shopware-worker文件中添加:
    www-data ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl restart shopware-worker:*
    
  • 对应修改代码中的重启命令:
    $process = new Process(['sudo', 'supervisorctl', 'restart', 'shopware-worker:*']);
    

3. 替代方案:用Shopware内置命令触发重启

如果不想直接调用Supervisor命令,可利用Shopware自带的messenger:stop-workers命令停止Worker,依赖Supervisor的autorestart=true配置(默认开启)自动拉起新进程:

private function restartSupervisorWorker(): void
{
    $projectDir = $this->container->getParameter('kernel.project_dir');
    $process = new Process(['php', $projectDir . '/bin/console', 'messenger:stop-workers']);
    $process->run();
}

注意事项

  • 确保服务器上的命令路径正确(如supervisorctl可能位于/usr/bin/supervisorctl),根据实际环境调整。
  • 避免在插件更新、卸载等不必要场景触发重启,可根据需求选择仅在安装/激活时执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:52:36