我需要运行一个php脚本作为守护进程(等待指令并做一些事情)。cron作业不会为我做这件事,因为需要在指令到达时立即采取行动。我知道由于内存管理问题,PHP不是守护进程的最佳选择,但由于各种原因,在这种情况下我必须使用PHP。我偶然发现了libslack的一个叫做守护进程(http://libslack.org/daemon)的工具,它似乎可以帮助我管理守护进程,但在过去的5年里没有任何更新,所以我想知道你是否有其他适合我的替代方案。任何信息都将非常感谢。
发布于 2010-01-10 18:46:49
您可以使用以下命令从命令行(即bash)启动php脚本
nohup php myscript.php &
&
会将您的进程放在后台。
编辑:
是的,有一些缺点,但不可能控制?这是错误的。
一个简单的kill processid
就能阻止它。而且它仍然是最好和最简单的解决方案。
发布于 2013-05-16 09:54:20
另一种选择是使用Upstart。它最初是为Ubuntu开发的(默认情况下与其打包在一起),但旨在适用于所有Linux发行版。
这种方法类似于Supervisord和daemontools,因为它在系统引导时自动启动守护进程,并在脚本完成时重新启动。
如何设置:
在/etc/init/myphpworker.conf
上创建一个新的脚本文件。下面是一个示例:
# Info
description "My PHP Worker"
author "Jonathan"
# Events
start on startup
stop on shutdown
# Automatically respawn
respawn
respawn limit 20 5
# Run the script!
# Note, in this example, if your PHP script returns
# the string "ERROR", the daemon will stop itself.
script
[ $(exec /usr/bin/php -f /path/to/your/script.php) = 'ERROR' ] && ( stop; exit 1; )
end script
启动和停止守护进程:
sudo service myphpworker start
sudo service myphpworker stop
检查您的守护进程是否正在运行:
sudo service myphpworker status
谢谢
非常感谢Kevin van Zonneveld,我从那里学到了这项技术。
发布于 2010-01-19 06:57:13
解决这个问题的方法不止一种。
我不知道具体细节,但也许还有另一种方法可以触发PHP进程。例如,如果您需要基于SQL数据库中的事件运行代码,则可以设置触发器来执行脚本。在PostgreSQL:http://www.postgresql.org/docs/current/static/external-pl.html下很容易做到这一点。
老实说,我认为您最好的选择是使用nohup创建一个Damon进程。nohup允许命令在用户注销后继续执行:
nohup php myscript.php &
然而,有一个非常严重的问题。正如您所说的,PHP的内存管理器完全是垃圾,它是基于脚本只执行几秒钟就会存在的假设而构建的。您的PHP脚本将在几天后开始使用to的内存。您还必须创建一个cron脚本,它每12小时或24小时运行一次,它会终止并重新生成php脚本,如下所示:
killall -3 php
nohup php myscript.php &
但是,如果脚本正在进行中呢?kill -3是一个中断,它与在命令行界面上执行ctrl+c是一样的。您的php脚本可以捕获这个中断并使用PHP pcntl库优雅地退出:http://php.oregonstate.edu/manual/en/function.pcntl-signal.php
下面是一个示例:
function clean_up() {
GLOBAL $lock;
mysql_close();
fclose($lock)
exit();
}
pcntl_signal(SIGINT, 'clean_up');
$lock背后的思想是PHP脚本可以使用fopen(" file ","w");打开文件。一个文件上只能有一个进程的写锁,因此使用这个锁可以确保只有一个PHP脚本副本在运行。
祝好运!
https://stackoverflow.com/questions/2036654
复制相似问题