如何使用带有按需CakePHP工作程序的队列?

时间:2018-01-25 16:59:28

标签: php amazon-web-services cakephp queuing

在CakePHP中,有各种用于管理队列的系统(RabbitMQbeanstalkAmazon SQSdereuromark’s cakephp-queue),但所有这些系统似乎都需要守护进程工人的任务。这些永远在线的工作人员(后面有CakePHP的全部功能)在他们进入队列时进行工作,进行处理,然后闲置直到下一份工作出现。

目前,我正在使用基于beanstalk的队列(上面已链接),并且它运行正常,但就服务器资源而言,它并不是特别有效。我们有内存泄漏,有时必须杀死并重启进程。

然而,现在我正在尝试添加更多不同类型的“管”(用beanstalk的说法),并且我在我们的服务器上遇到RAM问题,这些服务器同时运行着这么多不同的工作者。当我启动所有我想要的不同工作者时,我会得到致命的内存错误。

我宁愿拥有类似“无服务器”/ Lambda风格的设置,工作人员按需启动,完成其工作,然后自行终止。有点像调用CakePHP shell的cron作业,但是从队列中动态填充作业数据。

有没有人有这种排队设置的经验?我在基于AWS的基础架构上,所以使用亚马逊服务的任何东西都会特别有用。

1 个答案:

答案 0 :(得分:1)

据我所知,运行PHP只有两种方法。既可以作为Web容器内的线程(Apache,Nginx,CGI),也可以作为shell进程(单线程)。当你在shell上运行它时,每个进程都会遇到1个线程。

我知道这很糟糕,但PHP并不是服务器工作者的最佳工具。 Lambda架构并不能真正帮助解决这个问题。您只需将多线程问题加载到其他主机即可。

在一天结束时,最简单的解决方案是运行更多PHP进程。如果你发生了崩溃事件。您需要在shell脚本中运行PHP。它只是命令行上PHP的本质。

但是,我会根据自己的经验分享您的其他选择。

  

然而,现在我试图添加更多不同类型的"管" (用beanstalk的说法),我在同时运行这么多不同工作者的服务器上遇到RAM问题。当我启动所有我想要的不同工作者时,我会得到致命的内存错误。

上次我检查beanstalk是单线程的。因此,我不认为PHP可以使用beanstalk同时生成多个worker。你必须运行1个PHP实例来获取消息并对其进行处理。如果要扩展,则必须运行多个PHP实例。

听起来你的员工要么有内存泄漏,要么就是消耗大量内存。我不知道这与豆茎有什么关系。您必须修复泄漏并更改源代码以减少内存使用。

我不得不重写PHP代码以使用转发XML解析器,因为其他XML解析器会将整个文档加载到内存中。正向读取解析器使用较少的内存,但重写所有代码是一件痛苦的事。你必须决定你的成本。花更多钱在Ram上或花时间重写代码。这是你的电话。

内存

PHP附带内存使用的软限制。即使主机有大量内存,PHP线程在达到软限制时也会抛出内存不足错误。您需要在php.ini文件中手动更改。请原谅我,如果你已经这样做了,但我认为值得一提。

php.ini中增加PHP内存限制:

memory_limit = 128M

一次性模式

我使用一次性模式解决了很多内存泄漏问题。它只是您在对象上使用的简单interface,然后将代码包装在using()函数中。使用此库,我能够将内存泄漏减少99%。 (完全披露,这是我的github库)。

https://github.com/cgTag/php-disposable

多线程PHP

有一个开源项目可以为PHP添加多线程支持,它看起来就像一个可靠的库。

https://github.com/krakjoe/pthreads

该项目为PHP(带有C ++模块)添加了多线程支持,基本上为每个线程创建了一个新的全局范围。这允许您在每个线程中运行CakePHP shell,我认为有一个用于线程到线程共享数据的API(互斥体和类似的东西)。

Dockerize

我在运行docker时只是为了处理一个CakePHP shell任务而取得了一些成功。这使我可以通过在同一台主机上运行多个容器来快速扩展。容器额外内存的开销实际上并不是那么糟糕。我不记得确切的数字,但它比你想象的要少。

守护程序

它们是在Linux上运行服务的久经考验的方式。这里唯一的问题是它是每个守护进程的PHP中的1个。因此,您必须注册多个守护进程才能进行扩展。话虽如此,这个选项适用于上面的多线程库。