如何将队列与按需 CakePHP worker 一起使用



在CakePHP中,有各种系统来管理队列本身(RabbitMQ,beanstalk,Amazon SQS,dereuromark的cakephp-queue),但所有这些似乎都需要守护程序化的worker任务。这些永远在线的worker(他们背后有CakePHP的全部功能)在他们进入队列时监听作业,进行处理,然后闲置,直到下一个作业出现。

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

但是,现在我正在尝试添加更多不同类型的"管"(用 beanstalk 的说法),并且我在同时运行这么多不同工人的服务器上遇到了 RAM 问题。当我启动我想要的所有不同工作线程时,我会出现致命的内存不足错误。

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

有没有人有这种排队设置的经验?我使用的是基于 AWS 的基础设施,因此任何使用 Amazon 服务的东西都会特别有用。

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

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

归根结底,最简单的解决方案是运行更多的PHP进程。如果您遇到崩溃。你需要在 shell 脚本中运行 PHP。这只是命令行上PHP的本质。

但是,我将根据我的经验分享您还有其他选择。

但是,现在我正在尝试添加更多不同类型的"管"(用 beanstalk 的说法),并且我在同时运行这么多不同工人的服务器上遇到了 RAM 问题。当我启动我想要的所有不同工作线程时,我会出现致命的内存不足错误。

上次我检查 be豆茎是单线程的。所以我认为 PHP 不可能用 beanstalk 同时生成多个工人。您必须运行 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(互斥锁和类似的东西)。

多克利兹

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

守护 进程

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

最新更新