使用NSSM将PHP脚本封装为Windows服务

场景

有时候我们需要将程序一直重复在后台运行,例如我们需要用php来监听数据库中是否有需要发送的短信和邮件,如果有则执行发送操作。那么这个程序需要一直在后台运行,有时候程序会崩溃,我们希望程序可以自动重启而不是手动重启。

NSSM简介

NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行。同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大。它的特点如下:

  • 支持普通exe程序(控制台程序或者带界面的Windows程序都可以)
  • 开箱即用,操作简单
  • 可以重定向输出日志信息以及错误日志信息
  • 可以自动守护封装了的服务,程序挂掉了后可以自动重启
  • 可以自定义环境变量

官方下载地址:http://www.nssm.cc/download

备用下载地址:nssm 2.24

示例

例如这里有一个PHP程序test.php需要重复在后台执行,test.php代码如下:

<?php
while(true){
    echo date('Y-m-d H:i:s')."\r\n";
    error_log(date('Y-m-d H:i:s')."\r\n",3,'D:\log.txt');
    sleep(2);
}

我们使用php test.php即可执行以上程序。效果如下图:

只要我们不关闭这个窗口,程序将一直执行下去。

但很多时候程序会莫名其妙就挂掉,那么我们只能再次执行php test.php来重启程序。

将程序封装为windows服务

下载NSSM后,进入nssm.exe文件所在的文件夹,在cmd中执行:nssm install MyService打开nssm的配置界面,如下图:

安装服务后,将在注册表\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService\Parameters中自动录入以下信息:

启动服务

也可以输入命令:nssm start MyService启动服务。

启动服务后,可以看到D:\log.txt文件不断有内容写入,说明PHP程序已开始执行。

模拟程序崩溃

打开windows任务管理器,结束php.exe这个进程,会发现,结束后,立马会有一个新的php.exe进程重启,前面的PHP程序仍然在执行。

nssm常用命令

安装服务实例:nssm install +【服务实例名称】
删除服务实例:nssm remove +【服务实例名称】
删除服务实例并确定:nssm remove +【服务实例名称】 confirm
修改服务(显示界面进行修改):nssm edit +【服务实例名称】
启动服务:nssm start +【服务实例名称】
停止服务:nssm stop + 【服务实例名称】
重启服务:nssm restart + 【服务实例名称】

发表评论

邮箱地址不会被公开。 必填项已用*标注