PHP 守护进程/工作环境
问题:我想实现几个在 MQ 服务器队列上监听异步作业的 php-worker 进程。 现在的问题是,简单地将这个进程作为服务器上的守护进程运行并不能真正让我对实例(加载、状态、锁定)进行任何级别的控制......除了转储 ps -aux 之外。 因此,我正在寻找某种运行时环境,让我可以在系统(进程)级别或更高层(某种 Java 风格的应用程序服务器)上监视和控制实例。
有任何指针吗?
Problem: I want to implement several php-worker processes who are listening on a MQ-server queue for asynchronous jobs. The problem now is that simply running this processes as daemons on a server doesn't really give me any level of control over the instances (Load, Status, locked up)...except maybe for dumping ps -aux.
Because of that I'm looking for a runtime environment of some kind that lets me monitor and control the instances, either on system (process) level or on a higher layer (some kind of Java-style appserver)
Any pointers?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是一些可能有用的代码。
Here's some code that may be useful.
听起来您已经在 *nix 系统上启动并运行了 MQ,并且只需要一种管理工作人员的方法。
一个非常简单的方法是使用 GNU screen。 要启动 10 个工作程序,您可以使用:
这将使用名为worker_1、2、3 等的屏幕在后台启动 10 个工作程序。
您可以通过运行 screen -r worker_ 重新连接到屏幕,并使用 screen -list 列出正在运行的工作线程。
有关更多信息,本指南可能会有所帮助:
http://www.kuro5hin.org/story/2004/3/ 9/16838/14935
另请尝试:
对于生产服务器,我通常建议使用正常的系统启动脚本,但我多年来一直从启动脚本运行屏幕命令,没有出现任何问题。
It sounds like you already have a MQ up and running on a *nix system and just want a way to manage workers.
A very simple way to do so is to use GNU screen. To start 10 workers you can use:
This will start 10 workers in the background using screens named worker_1,2,3 and so on.
You can reattach to the screens by running screen -r worker_ and list the running workers by using screen -list.
For more info this guide may be of help:
http://www.kuro5hin.org/story/2004/3/9/16838/14935
Also try:
For production servers I would normally recommend using the normal system startup scripts, but I have been running screen commands from the startup scripts for years with no problems.
您真的需要它持续运行吗?
如果您只想根据请求生成新进程,可以将其注册为 xinetd 中的服务。
Do you actually need it to be continuously running?
If you only want to spawn new process on request, you can register it as a service in xinetd.
PHP 的 pcntl 插件类型服务器守护进程
http://dev.pedemont.com/sonic/
a pcntl plugin type server daemon for PHP
http://dev.pedemont.com/sonic/
下面是我们对 @chaos 答案的工作实现。 处理信号的代码被删除,因为该脚本通常只有几毫秒。
另外,在代码中,我们添加了 2 个函数来在调用之间保存 pid:restore_processors_state() 和 save_processors_state()。 我们在那里使用了
redis
,但您可以决定在文件上使用实现。我们使用 cron 每分钟运行这个脚本。 Cron 检查所有进程是否存活。 如果没有 - 它会重新运行它们然后死掉。 如果我们想终止现有进程,那么我们只需使用参数
kill
运行此脚本:php script.php Kill
。无需将脚本注入 init.d 即可运行工作程序的非常方便的方法。
Bellow is our working implementation of @chaos answer. Code to handle signals was removed as this script lives usually just few milliseconds.
Also, in code we added 2 functions to save pids between calls: restore_processors_state() and save_processors_state(). We've used
redis
there, but you can decide to use implementation on files.We run this script every minute using cron. Cron checks if all processes alive. If not - it re-run them and then dies. If we want to kill existing processes then we simply run this script with argument
kill
:php script.php kill
.Very handy way of running workers without injecting scripts into init.d.