sunvalley-technologies / php-task-manager-symfony-bundle
PHP任务管理器Symfony扩展包
Requires
- ext-json: *
- sunvalley-technologies/php-task-manager: ^1.2.4
- symfony/framework-bundle: ^3.0|^4.0|^5.0
- symfony/validator: ^3.0|^4.0|^5.0
Requires (Dev)
- doctrine/doctrine-bundle: ^2.1.2
- phpunit/phpunit: ~6.0|~7.0
- symfony/console: ^3.0|^4.0|^5.0
- symfony/phpunit-bridge: ^3.0|^4.0|^5.0
- symfony/yaml: ^3.0|^4.0|^5.0
Conflicts
- doctrine/doctrine-bundle: <1.3
- symfony/doctrine-bridge: <2.7
README
此扩展包将任务管理器集成到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); } }
与普通任务管理器任务不同,对finishTask
或failTask
的调用是可选的。但是,任何抛出的异常都将被捕获,并使用failTask($error)
返回。
要提交任务,应构建任务,然后可以像上面的示例服务一样使用客户端提交。
任务构造函数永远不会阻塞,否则主任务管理器循环也可能被阻塞。
启动任务管理器
可以使用控制台命令task:manager
来启动任务管理器。
为了附加到您使用Symfony启动的运行循环,有一个任务管理器工厂SunValley\TaskManager\Symfony\Task\TaskManagerFactory
。
任务管理器默认使用其配置中定义的循环php_task_manager_loop
。
在需要自定义的情况下,许多这些可以通过编译器传递进行更改。
其他主题
Doctrine实体存储库任务
\SunValley\TaskManager\Symfony\Doctrine\EntityRepositoryTask
任务可用于将同步doctrine调用卸载到后台以供异步应用程序使用。此任务对于常规工作队列没有意义,但对于部分依赖doctrine进行ORM访问的异步应用程序可能很有用。