win32_set_service_status

(PECL win32service >=0.1.0)

win32_set_service_status更新服务状态

描述

win32_set_service_status(int $status, int $checkpoint = 0): void

通知 SCM 正在运行的服务的当前状态。此调用仅对正在运行的服务进程有效。

警告

从 0.2.0 版本开始,此函数仅在 “cli” SAPI 中工作。在其他 SAPI 中,此函数被禁用。

参数

status

服务状态代码,其中之一是 WIN32_SERVICE_RUNNINGWIN32_SERVICE_STOPPEDWIN32_SERVICE_STOP_PENDINGWIN32_SERVICE_START_PENDINGWIN32_SERVICE_CONTINUE_PENDINGWIN32_SERVICE_PAUSE_PENDINGWIN32_SERVICE_PAUSED

checkpoint

服务定期递增的检查点值,以报告其在长时间启动、停止、暂停或继续操作期间的进度。例如,服务在启动时完成初始化的每个步骤时,应递增此值。

statusWIN32_SERVICE_STOP_PENDINGWIN32_SERVICE_START_PENDINGWIN32_SERVICE_CONTINUE_PENDINGWIN32_SERVICE_PAUSE_PENDING 中的一个时,checkpoint 才是有效的。

返回值

不返回值。

在 1.0.0 版之前,成功时返回 WIN32_NO_ERROR,如果参数有问题,则返回 false,如果失败,则返回 Win32 错误代码

错误/异常

在 1.0.0 版之前,如果 SAPI 不是 "cli",则此函数会发出 E_ERROR 级别的错误。

从 1.0.0 版开始,如果 SAPI 不是 "cli",则会抛出 Win32ServiceException

变更日志

版本 描述
PECL win32service 1.0.0 如果参数中的数据无效,则会抛出 ValueError,以前返回 false
PECL win32service 1.0.0 如果出错,则会抛出 Win32ServiceException,以前返回 Win32 错误代码
PECL win32service 1.0.0 返回类型现在是 void,以前是 mixed
PECL win32service 0.2.0 此函数仅在 "cli" SAPI 中工作。

参见

添加注释

用户贡献注释 2 个注释

m dot hald at surfto dot ch
16 年前
在我的机器(Win XP SP2)上,函数 “win32_get_last_control_message” 从未返回 4,因此我必须也对 0 做出响应。

最后,在混合了几个示例之后,我现在有一个版本可以正常工作,而不会在事件日志中填入错误。

<?php

/*
* PHP 示例模板
*/

/*
* 应用主函数
* 每秒执行一次,上次函数执行完成后调用
* 执行时间不应超过 20 秒
* 否则,应至少每 20 秒调用一次 NTServiceResponder();
* 警告:如果存在停止请求,NTServiceResponder 将退出;
*/
function Service_Main()
{
// 您的应用程序代码在此处!!!
sleep(1); // 模拟一些操作
}

/********************************************************************
*
* 服务控制
*
********************************************************************/

$SERVICE_NAME = "phptestservice";
$SERVICE_DISPLAY = "使用 PHP 的测试服务";

// 因此您可以获取:$SERVICE_PATH_PARTS["dirname"] $SERVICE_PATH_PARTS["basename"] $SERVICE_PATH_PARTS["extension"]
$SERVICE_PATH_PARTS = pathinfo(__FILE__);

$SERVICE_PARAMS = " run";

if (!isset(
$argv[1]))
{
die(
"此应用程序需要作为服务安装。\n 使用参数 install 运行");
}

if (
$argv[1] == 'install')
{
$x = win32_create_service(array(
'service' => $SERVICE_NAME,
'display' => $SERVICE_DISPLAY,
'params' => __FILE__ . $SERVICE_PARAMS,
//'path' => $SERVICE_PATH_PARTS["dirname"] . '\php.exe'
));
debug_zval_dump($x);
exit;
}
else if (
$argv[1] == 'uninstall')
{
$x = win32_delete_service('dummyphp');
debug_zval_dump($x);
exit;
}
else if (
$argv[1] != 'run')
{
die(
"参数错误,需要作为服务运行");
}

// 连接到服务调度器并通知启动成功
if (!win32_start_service_ctrl_dispatcher($SERVICE_NAME)) die('无法连接到服务:'.$SERVICE_NAME);
win32_set_service_status(WIN32_SERVICE_RUNNING);

// 主服务器循环
while (1)
{
NTServiceResponder();

// 主脚本在此处执行
Service_Main();

sleep(1); // 每个循环至少延迟 1 秒
}
win32_set_service_status(WIN32_SERVICE_STOPPED);

/*
* 响应 NTServiceRequests
*/
function NTServiceResponder()
{

switch (
win32_get_last_control_message())
{
case
0: // 修补程序:似乎永远不会进入 4(WIN32_SERVICE_CONTROL_INTERROGATE)
win32_set_service_status(WIN32_SERVICE_RUNNING);
return
TRUE;
break;
case
WIN32_SERVICE_CONTROL_CONTINUE:
return
TRUE; // "继续"
case WIN32_SERVICE_CONTROL_INTERROGATE:
win32_set_service_status(WIN32_SERVICE_RUNNING);
return
TRUE; // 使用状态响应
case WIN32_SERVICE_CONTROL_STOP:
win32_set_service_status(WIN32_SERVICE_STOPPED);
exit;
// 终止脚本
default:
win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // 添加更多情况以处理其他服务调用
}

return
FALSE;
}

?>
paul_nelson57071 at yahoo dot com
14 年前
经过长时间的搜索,我终于找到了所有制作 Windows 服务和服务器的必要组件,包括
- 安装和卸载服务
- 启动和停止服务
- 实际运行基本的服务器
- 响应 Windows 服务以停止/启动/重启

希望您觉得有用!我使用 PHP 5.2 和 5.2 的 PECL 库完成了这些操作(当时 PHP 5.3 没有为其编译 PECL 库)

<?php
// 服务设置
$Service = 'MyServiceFinal';
$Display = '我的 PHP 服务';

// 服务器设置
$host = '127.0.0.1'; // 绑定到 IP #
$port = 23; // 在端口 # 上
$max = 20; // 最大客户机


// 如果没有启动参数,则退出
if (!isset($argv[1])){ShowHelp(); exit;}

// 创建 Windows 服务
if ($argv[1] == 'install') {
$x = win32_create_service(array(
'service' => $Service,
'display' => $Service,
'params' => __file__ . ' run',
'path' => 'c:\\php\\php.exe',
));
debug_zval_dump($x);
echo
"服务已安装\n\n";
exit;

// 删除 Windows 服务
} else if ($argv[1] == 'uninstall') {
$x = win32_delete_service($Service);
debug_zval_dump($x);
echo
"服务已删除\n\n";
exit;

// 启动 Windows 服务
} elseif($argv[1] == "start") {
$x = win32_start_service($Service);
debug_zval_dump($x);
echo
"服务已启动\n\n";
exit;

// 停止 Windows 服务
} elseif($argv[1] == "stop") {
$x = win32_stop_service($Service);
debug_zval_dump($x);
echo
"服务已停止\n\n";
exit;

// 未知命令
} else if ($argv[1] != 'run') {
ShowHelp(); exit();
}

// 告诉 Windows 服务已启动...
if (!win32_start_service_ctrl_dispatcher($Service)) die("无法连接到服务: $Service");
win32_set_service_status(WIN32_SERVICE_RUNNING);

// 没有超时,立即刷新内容
set_time_limit(0);
ob_implicit_flush();

// 服务器循环
while (1) {
usleep(500);

// 处理 Windows 服务请求
switch (win32_get_last_control_message()) {
case
WIN32_SERVICE_CONTROL_CONTINUE: break; // 继续服务器例程
case WIN32_SERVICE_CONTROL_INTERROGATE: win32_set_service_status(WIN32_NO_ERROR); break; // 使用状态响应
case WIN32_SERVICE_CONTROL_STOP: win32_set_service_status(WIN32_SERVICE_STOPPED); exit; // 终止脚本
default: win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // 添加更多情况以处理其他服务调用
}
// 实际的服务器代码

}

// 清理并退出
win32_set_service_status(WIN32_SERVICE_STOPPED);
exit;

//*************** 函数 ***************
function ShowHelp(){
echo
"用法:
install:\t 安装服务
uninstall:\t 删除服务
start:\t\t 启动 Windows 服务
stop:\t\t 停止 Windows 服务
run:\t\t 由 CMS 调用以运行服务

有关代码编号的信息,请键入 'net helpmsg xxxx'
示例:'net helpmsg 1072'

"
;
}
?>
To Top