首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将php脚本作为守护进程运行

将php脚本作为守护进程运行
EN

Stack Overflow用户
提问于 2010-01-10 18:06:50
回答 7查看 157.5K关注 0票数 166

我需要运行一个php脚本作为守护进程(等待指令并做一些事情)。cron作业不会为我做这件事,因为需要在指令到达时立即采取行动。我知道由于内存管理问题,PHP不是守护进程的最佳选择,但由于各种原因,在这种情况下我必须使用PHP。我偶然发现了libslack的一个叫做守护进程(http://libslack.org/daemon)的工具,它似乎可以帮助我管理守护进程,但在过去的5年里没有任何更新,所以我想知道你是否有其他适合我的替代方案。任何信息都将非常感谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-10 18:46:49

您可以使用以下命令从命令行(即bash)启动php脚本

nohup php myscript.php &

&会将您的进程放在后台。

编辑:

是的,有一些缺点,但不可能控制?这是错误的。

一个简单的kill processid就能阻止它。而且它仍然是最好和最简单的解决方案。

票数 176
EN

Stack Overflow用户

发布于 2013-05-16 09:54:20

另一种选择是使用Upstart。它最初是为Ubuntu开发的(默认情况下与其打包在一起),但旨在适用于所有Linux发行版。

这种方法类似于Supervisorddaemontools,因为它在系统引导时自动启动守护进程,并在脚本完成时重新启动。

如何设置:

/etc/init/myphpworker.conf上创建一个新的脚本文件。下面是一个示例:

代码语言:javascript
复制
# 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

启动和停止守护进程:

代码语言:javascript
复制
sudo service myphpworker start
sudo service myphpworker stop

检查您的守护进程是否正在运行:

代码语言:javascript
复制
sudo service myphpworker status

谢谢

非常感谢Kevin van Zonneveld,我从那里学到了这项技术。

票数 173
EN

Stack Overflow用户

发布于 2010-01-19 06:57:13

解决这个问题的方法不止一种。

我不知道具体细节,但也许还有另一种方法可以触发PHP进程。例如,如果您需要基于SQL数据库中的事件运行代码,则可以设置触发器来执行脚本。在PostgreSQL:http://www.postgresql.org/docs/current/static/external-pl.html下很容易做到这一点。

老实说,我认为您最好的选择是使用nohup创建一个Damon进程。nohup允许命令在用户注销后继续执行:

代码语言:javascript
复制
nohup php myscript.php &

然而,有一个非常严重的问题。正如您所说的,PHP的内存管理器完全是垃圾,它是基于脚本只执行几秒钟就会存在的假设而构建的。您的PHP脚本将在几天后开始使用to的内存。您还必须创建一个cron脚本,它每12小时或24小时运行一次,它会终止并重新生成php脚本,如下所示:

代码语言:javascript
复制
killall -3 php
nohup php myscript.php &

但是,如果脚本正在进行中呢?kill -3是一个中断,它与在命令行界面上执行ctrl+c是一样的。您的php脚本可以捕获这个中断并使用PHP pcntl库优雅地退出:http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

下面是一个示例:

代码语言:javascript
复制
function clean_up() {
  GLOBAL $lock;
  mysql_close();
  fclose($lock)
  exit();
}
pcntl_signal(SIGINT, 'clean_up');

$lock背后的思想是PHP脚本可以使用fopen(" file ","w");打开文件。一个文件上只能有一个进程的写锁,因此使用这个锁可以确保只有一个PHP脚本副本在运行。

祝好运!

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2036654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档