windows php 服务,PHP 程序跑在 Windows 服务上

起因

项目在window上后台运行Workerman,避免命令行窗口给别人关闭,并且系统重启时自动运行项目。我一开始想的是用计划任务来做,但是总监建议用服务或第三方软件来控制,所以开启了探索之路。

运行环境

php:workerman3.5

服务器:Windows Server2008

过程

搜索了php的扩展,发现有一个扩展:win32service,可以利用此扩展生成一个运行php的服务,可以避免命令行窗口给别人关闭,同样可以系统重启自动运行,于是开始了摸索之路,原本以为会很顺利的,但是并没有....

代码实现

从网上搜了个代码来使用,自己改了下..

class WinService

{

//服务名称

private $name = 'forWorkerman3';

//定义服务名称

private $info_name = "forWorkerman3";

//定义php.exe存放路径

private $path = "E:\php\php-7.2.1-nts\php.exe";

//定义所要执行的程序

private $params = "E:\phpwork\process\start.php";

public function install()

{

/* 注册服务 */

$server = win32_create_service(array(

'service' => $this->name,

'display' => $this->info_name,

'path' => $this->path,

'params' => $this->params,

));

if ($server !== true) {

return "安装失败" . "\t 错误代码:" . dechex($server);

}

return '服务创建成功!';

}

/* 移除服务 */

public function uninstall()

{

$removeService = win32_delete_service($this->name);

$log = '';

switch ($removeService) {

case 1060:

$log = '服务不存在';

break;

case 1072:

$log = '服务无法卸载 ';

break;

case 0:

$log = "服务卸载成功";

break;

default :

break;

}

return $log;

}

public function restart()

{

/* 重启服务 */

$svcStatus = win32_query_service_status($this->name);

if ($svcStatus == 1060) {

return "服务[" . $this->name . "]未被安装,请先安装";

}

if ($svcStatus['CurrentState'] == 1) {

return $this->start();

}

$stop = win32_stop_service($this->name);

if ($stop != 0) {

return "服务正在执行,请重试! ";

} else {

return $this->start();

}

}

public function start()

{

$start = win32_start_service($this->name);

if ($start != 0) {

return " 服务正在运行中! ";

}

return " 服务已启动! ";

}

public function stop()

{

$stop = win32_stop_service($this->name);

if ($stop != 0) {

return "服务未启动";

}

return "服务已停止";

}

}

$service = new WinService();

if (php_sapi_name() !== 'cli') {

trigger_error("脚本只能运行在cli模式下");

exit();

}

$log = '';

switch ($argv[1]) {

case "install" :

$log = $service->install();

break;

case "uninstall" :

$log = $service->uninstall();

break;

case "start":

$log = $service->start();

break;

case "stop":

$log = $service->stop();

break;

case "restart":

$log = $service->restart();

break;

default:

var_dump("无事发生...");

}

echo $log;

结果

然而是我太年轻了,运行普通的php程序是没有任何问题的,但是运行workerman却无法正常运行。实际上测试到的结果是,在开启服务的期间,workerman实际上是运行成功了,但是却无法一直保持着服务开启的状态。找了许久的解决方法也没找到,所以就放弃了。

意外收获

在网上搜解决保持服务开启的解决方案时候,意外发现有软件可以帮我生成一个服务,这个软件就是Nssm。下载好之后用命令行运行nssm.exe install

786a70495f40b3a7286cea76739ddfc4.png

这个界面就是这个软件的gui了。按照自己的需求打开

8ebb4e2176f7be6200cc31c21981dde7.png

选择自己要运行的文件

b8ed9d7c57994e81f0023c096cb142f5.png

点击install service即可安装成服务了

如果要卸载服务运行nssm.exe remove

本作品采用《CC 协议》,转载必须注明作者和本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值