PHP中的并行处理 - 你是怎么做到的?

我目前正在尝试在php中实现作业队列。然后,队列将作为批处理作业进行处理,并且应该能够并行处理某些作业。

我已经做了一些研究,并找到了几种实现它的方法,但我并没有真正意识到它们的优点和缺点。

例如,通过多次调用脚本来执行并行处理,如下所示:
PHP中的简单并行处理fsockopen

我发现的另一种方法是使用这些函数。
curl_multi_exec PHP 文档curl_multi

但我认为这两种方法会增加在应该主要在后台运行的队列上创建批处理的开销吗?

我还读到这似乎也是处理问题的一种方式。但看起来,如果你真的不知道自己在做什么(就像我现在一样),它会变得非常混乱。pcntl_fork

我也看了一下,但是在那里我还需要根据需要动态生成工作线程,而不仅仅是运行几个,然后让齿轮工作业服务器将其发送给免费工作线程。特别是因为线程应该在执行一个作业后干净地退出,以免遇到最终的内存泄漏(该问题中的代码可能并不完美)。
Gearman 入门Gearman

所以我的问题是,你如何处理PHP中的并行处理?为什么选择您的方法,不同的方法可能有哪些优点/缺点?


答案 1

我使用.它简单干净。你基本上需要构建一个线程管理器和线程脚本,这将做你需要的。exec()

我不喜欢,因为它会打开一个服务器连接,这将建立并可能达到apache的连接限制fsockopen()

出于同样的原因,我不喜欢函数curl

我不喜欢,因为它需要可用的pnctl扩展,并且您必须跟踪父/子关系。pnctl

从来没有和齿轮工一起玩过...


答案 2

好吧,我想我们有3个选项:

A. 多线程:

PHP 本身不支持多线程。但是有一个PHP扩展(实验性)称为pthreads(https://github.com/krakjoe/pthreads),它允许你做到这一点。

B. 多进程:

这可以通过3种方式完成:

  • 分 叉
  • 执行命令
  • 管道

C. 分布式并行处理:

它是如何工作的:

  1. 应用程序将数据(AKA消息)“可以是JSON格式的”发送到引擎(MQ引擎)“可以是本地或外部的Web服务”Client
  2. 将数据“主要存储在内存中,也可以选择存储在数据库中”的队列中(您可以定义队列名称)MQ Engine
  3. 该应用程序要求MQ引擎按顺序(FIFO或基于优先级)处理数据(消息)“您也可以从特定队列请求数据”。Client


一些 MQ 引擎:

  • ZeroMQ(不错的选择,很难使用)一个面向消息的IPC库,是Erlang中的消息队列服务器,将作业存储在内存中。它是一个充当并发框架的套接字库。对于群集产品和超级计算,比 TCP 更快。
  • RabbitMQ(不错的选择,易于使用)自托管,企业消息队列,不是真正的工作队列 - 而是一个可以用作工作队列但需要其他语义的消息队列。
  • Beanstalkd(最佳选择,易于使用)(Laravel内置支持,由Facebook构建,用于工作队列) - 有一个“Beanstalkd控制台”工具,非常好
  • Gearman(问题:用于分布式处理的集中式代理系统)
  • Apache ActiveMQ是Java中最受欢迎的开源消息代理,(问题:很多错误和问题)
  • Amazon SQS (Laravel 内置支持,托管 - 因此无需管理。不是真正的工作队列,因此需要额外的工作来处理语义,例如埋葬作业)
  • IronMQ(Laravel内置支持,Write in Go,可作为云版本和内部部署)
  • Redis(Laravel内置支持,不是那么快,因为它不是为此而设计的)
  • 麻雀(用Ruby编写,基于memcache)
  • Starling(用Ruby编写,基于memcache,内置于twitter中)
  • 红隼(只是另一个QM)
  • Kafka(写于LinkedIn斯卡拉)
  • EagleMQ 开源、高性能、轻量级队列管理器(用 C 语言编写)

更多可以在这里找到:http://queues.io


推荐