win32_start_service_ctrl_dispatcher

(PECL win32service >=0.1.0)

win32_start_service_ctrl_dispatcher将脚本注册到 SCM,使其可以作为具有给定名称的服务运行

描述

win32_start_service_ctrl_dispatcher(string $name, bool $gracefulMode = true): void

当通过服务控制管理器启动时,服务进程需要“注册”到它,以建立服务监控和通信设施。此函数通过生成一个线程来处理与服务控制管理器的底层通信来执行注册。

启动后,服务进程应执行两件事。首先是告诉服务控制管理器服务正在运行。这是通过调用 win32_set_service_status() 并使用 WIN32_SERVICE_RUNNING 常量来实现的。如果你需要在服务实际运行之前执行一些长时间的操作,那么可以使用 WIN32_SERVICE_START_PENDING 常量。其次是继续与服务控制管理器保持注册,以便它可以确定是否应该终止。这是通过定期调用 win32_get_last_control_message() 并适当处理返回值来实现的。

注意

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

参数

name

服务的简称,由 win32_create_service() 注册。

gracefulMode

true 用于优雅退出。false 用于退出并报错。有关详细信息,请参阅 win32_set_service_exit_mode()

返回值

不返回值。

在 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.4.0 添加了 gracefulMode 参数。
PECL win32service 0.2.0 此函数仅在 "cli" SAPI 中工作。

示例

示例 #1 win32_start_service_ctrl_dispatcher() 示例

检查服务是否在 SCM 下运行。

<?php
if (!win32_start_service_ctrl_dispatcher('dummyphp')) {
die(
"我可能没有在服务控制管理器下运行");
}

win32_set_service_status(WIN32_SERVICE_START_PENDING);

// 一些长时间的进程来启动和运行此服务。

win32_set_service_status(WIN32_SERVICE_RUNNING);

while (
WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
# 在这里做一些工作,尽量不要超过大约 30 秒
# 然后再回到循环中
}
?>

另请参阅

添加注释

用户贡献注释 3 个注释

0
andrea
14 年前
如果字符串有空格,则在“之间插入参数值

<?php
// 首先你需要创建一个服务,你只需要做一次
/*
win32_create_service(array(
'service' => 'myphpservice',
'display' => 'My PHP Service',
'params' => '"c:\\my folder\myphpservice.php"',
'path' => 'c:\\PHP\\php.exe'));
*/
?>
-1
dylan at nopower dot org
17 年前
<?php
// 首先你需要创建一个服务,你只需要做一次
/*
win32_create_service(array(
'service' => 'myphpservice',
'display' => 'My PHP Service',
'params' => 'c:\\myphpservice.php',
'path' => 'c:\\PHP\\php.exe'));
*/

$myservicename = 'myphpservice';

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

// 主服务器循环
while (1) {
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); // 添加更多案例来处理其他服务调用
}

// 主脚本在这里

sleep(10); // 每 10 秒运行一次
}
win32_set_service_status(WIN32_SERVICE_STOPPED);
?>
-2
Guibod
17 年前
不要尝试在代码中过晚地调用“win32_start_service_ctrl_dispatcher”。你将触发 #2186 错误:“服务没有响应控制函数。”(来自命令行)或 #1053 错误:“服务没有及时响应启动或控制请求。”(来自服务 GUI)。

在将 php 脚本注册为服务之前,尝试不要加载一堆 PEAR 类,就像我做的那样。

另一个有用的提示是,要获取详细的返回值,您可以从命令行调用“NET HELPMSG ###”,其中 ### 是您的错误代码。
To Top