2024年PHP开发者大会日本站

win32_start_service_ctrl_dispatcher

(PECL win32service >=0.1.0)

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

描述

win32_start_service_ctrl_dispatcher(字符串 $name, 布尔值 $gracefulMode = true): void

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

启动后,服务进程应执行两件事。首先是告诉服务控制管理器服务正在运行。这是通过使用WIN32_SERVICE_RUNNING常量调用win32_set_service_status()来实现的。如果您需要在服务实际运行之前执行一些冗长的过程,则可以使用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,如果参数有问题或失败时返回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
15 年前
如果字符串中有空格,请在“之间插入参数值

<?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