一次运行多个Symfony命令

时间:2013-05-31 22:00:27

标签: php multithreading symfony command

我在Symfony设置中实现了一个命令,该命令从数据库中获取作业然后对其进行处理。

如何一次运行多个命令实例,以更快地完成作业。我知道PHP中不支持多线程,但是当从shell调用命令时,我想知道是否有解决方法。

使用以下方式调用命令:

app/console job:process

3 个答案:

答案 0 :(得分:7)

我解决这个问题的方法是使用一个包含多个工作人员的工作队列。它比管理多个进程和担心并发更容易管理和扩展。

我发现用于处理php / symfony的最简单的通用队列是beanstalkd,您可以使用LeezyPheanstalkBundle

将其集成到symfony2中

答案 1 :(得分:0)

一般情况下,我建议使用enqueue库。您可以选择各种可用的传输,从最简单的文件系统和Doctrine DBAL到像RabbitMQ和Amazon SQS一样真实。

关于消费者,您需要一些流程管理器。有几种选择:

  1. http://supervisord.org/ - 您需要额外的服务。它必须正确配置。

  2. 纯粹的PHP流程管理器,如this。基于Symfony进程组件和纯PHP代码。它可以处理进程重启,纠正sigterm信号的退出等等。

  3. this这样的php \ swoole流程管理器。它需要一个swoole PHP扩展,但它的性能是惊人的。

答案 2 :(得分:0)

我写了一篇关于如何解决这个确切问题的博客文章。 https://plume.baucum.me/~/Absolutely/running-multiple-processes-simultaneously-in-a-symfony-command

在此处重新哈希所有内容太长了,但是基本概念是您的命令可以选择接受作业的ID。该命令将检查是否提供了ID。如果不是这样,它将从数据库中获取所有作业,对其进行循环,然后使用job ID参数对其进行调用。在开始执行每个命令时,您会将其存储在一个数组中,如果该数组太大,您将入睡,以限制速率。命令完成后,将其从数组中删除。

使用作业ID运行该命令时,它将使用Symfony's lock component创建一个锁,这样就不会一次意外地处理两次作业。当作业完成或出现错误时,请解锁作业,这一点很重要。拥有ID和锁后,它将调用您编写的任何代码来实际处理作业。

使用这种技术,我花了数小时才能运行的命令,因为它同步完成每个任务仅需数分钟。确保尝试使用不同的调节器来平衡资源利用率和执行任务所需的时间。