sunvalley-technologies/php-task-manager-symfony-bundle

1.1.1 2020-10-08 14:52 UTC

This package is auto-updated.

Last update: 2024-09-08 22:58:50 UTC


README

Build Status

查看主要仓库以获取基本用法

此扩展包将任务管理器集成到Symfony中。支持Symfony ^3.0和^4.0。

安装

composer require sunvalley-technologies/php-task-manager-symfony-bundle

请确保将扩展包添加到您的Kernel的扩展包列表中。

配置

完整的配置如下所示

php_task_manager:
    task_queue: redis://127.0.0.1:6379
    task_storage: redis://127.0.0.1:6379
    pool:
        minimum_processes: 1
        maximum_processes: 10
        time_to_live: 60
        max_jobs_per_process: 10

其中task_queue是唯一必需的配置参数。

task_storage是可选的,如果提供,则用于存储任务信息。

如果您有非标准的Kernel,请查看并替换SunValley\TaskManager\Symfony\Task\TaskEnvironment类和AbstractSymfonyTask,以提供适合您的任务的正确Kernel。

生成和提交任务

生成任务是必要的,以便精确控制每个任务执行的内容。这可以理解为生成控制器。

所有与Kernel相关的类都应该扩展AbstractSymfonyTask,并且默认情况下它们是同步任务。

以下是一个示例任务,用于持久化doctrine实体

<?php

class ExampleTask extends \SunValley\TaskManager\Symfony\Task\AbstractSymfonyTask {
    


    protected function __run(\SunValley\TaskManager\ProgressReporter $reporter,\Symfony\Component\DependencyInjection\ContainerInterface $container){
        $data = $this->getOptions()['data'];
        $entityManager = $container->get('entity_manager');
        $entity = $entityManager->find('\Some\Entity');
        $entity->setData($data);
        $entityManager->persist($entity);
        $entityManager->flush();

        return 'Task Completed'; // will be passed as $result to $reporter->finishTask($result) if it is not called or failed before 
    }

    public function buildOptionsResolver() : \Symfony\Component\OptionsResolver\OptionsResolver{
        $resolver = new Symfony\Component\OptionsResolver\OptionsResolver();
        $resolver->setRequired('data');
        return $resolver;
    }

}

class MyService {
    use \Symfony\Component\DependencyInjection\ContainerAwareTrait;

    public function changeDataOnBackground($data) {
        $task = new ExampleTask(uniqid('', true), ['data' => $data]); // this can throw an exception if options are invalid
        $this->container->get('php_task_manager_client')->submitTaskSync($task);
    }
}

class MyAsyncService {

    /** @var \SunValley\TaskManager\Symfony\Task\TaskManagerFactory */
    private $taskManagerFactory;

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

    public function changeDataOnBackground($data): \React\Promise\PromiseInterface {
        $task = new ExampleTask(uniqid('', true), ['data' => $data]); // this can throw an exception if options are invalid

        return $this->taskManagerFactory->generate()->submitTask($task);
    }
}

与普通任务管理器任务不同,对finishTaskfailTask的调用是可选的。但是,任何抛出的异常都将被捕获,并使用failTask($error)返回。

要提交任务,应构建任务,然后可以像上面的示例服务一样使用客户端提交。

任务构造函数永远不会阻塞,否则主任务管理器循环也可能被阻塞。

启动任务管理器

可以使用控制台命令task:manager来启动任务管理器。

为了附加到您使用Symfony启动的运行循环,有一个任务管理器工厂SunValley\TaskManager\Symfony\Task\TaskManagerFactory

任务管理器默认使用其配置中定义的循环php_task_manager_loop

在需要自定义的情况下,许多这些可以通过编译器传递进行更改。

其他主题

Doctrine实体存储库任务

\SunValley\TaskManager\Symfony\Doctrine\EntityRepositoryTask任务可用于将同步doctrine调用卸载到后台以供异步应用程序使用。此任务对于常规工作队列没有意义,但对于部分依赖doctrine进行ORM访问的异步应用程序可能很有用。