1

我有一个用 PHP (CakePHP) 编写的网站,其中某些资源密集型任务由后台进程处理。这是通过 Beanstalkd 消息队列完成的。我需要一些方法来检索该后台进程的状态,以便我可以使用 Monit 对其进行监控。

后台进程是一个与 Beanstalkd 通信的 CakePHP Shell(只是一个 PHP CLI 脚本)。它只是在 Benastalkd 上做一个 reserve() 并等待新消息。当它收到一条消息时,它会处理它。我想要某种方式用Monit监控这个进程,以便在出现问题时重新启动后台进程。

到目前为止,我一直在考虑编写一个 PHP CLI 脚本,该脚本在 Beanstalkd 中删除一条消息。后台进程获取消息并以某种方式将其内部状态传回 CLI 脚本。但是怎么做?插座?共享内存?其他IPC方法?

还是我在这里可能太复杂了,有没有更简单的方法来使用 Monit 监控这样的过程?

提前致谢!

4

2 回答 2

2

这就是我最终做的事情。

CLI 脚本连接到 beanstalkd,创建一个新队列(管)并开始观察它。然后它在后台守护进程正在监视的队列中丢弃最高优先级的消息。该消息包含 CLI 脚本正在监视的新队列的名称。

后台进程几乎立即收到此消息(因为它具有最高优先级),生成一条状态消息并将其放入 CLI 脚本正在监视的队列中。CLI 脚本接收它,然后关闭队列。

当 CLI 脚本在 30 秒内没有得到响应时,它将退出并显示一个错误,表明后台守护程序(很可能)挂起。

我把这一切都绑在了Monit上。Monit 现在可以检查后台守护程序是否正在运行(通过 pidfile 和进程列表)并验证它实际上仍在处理消息(通过使用 CLI 工具测试它是否响应状态请求)

于 2009-11-30T22:50:56.403 回答
1

Monit 或 Nagios 可能有一个插件可以连接、运行统计数据并在“太多”时返回。目前还没有为此编写的“协议”,但修改现有的基于文本的协议(如 nntp 或 smtp)来做你想做的事情似乎并不难。从外观上看,这确实意味着用 C 语言编写它。

从 CLI-PHP 脚本中,我将通过两种不同方法中的一种(或两种)进行处理。

1/ 将(低)优先级消息放入队列,并确保它在几秒钟内返回。将其放入专用队列并确保在放入之前没有任何东西,这也是一个很好的补充。2/ 执行“统计”并查看有多少人在等待:“当前工作就绪”。

要将信息返回到网站(无论哪种方式),您都可以写入文件,或者写入 gts 读取并采取行动的 Memcached 之类的东西。

于 2009-11-26T16:30:50.780 回答