PHP Conference Japan 2024

win32_create_service

(PECL win32service >=0.1.0)

win32_create_service在 SCM 数据库中创建一个新的服务条目

描述

win32_create_service(数组 $details, 字符串 $machine = null): void

尝试将服务添加到 SCM 数据库中。需要管理员权限才能成功。

参数

details

服务详细信息的数组

service

服务的短名称。这是您将使用 net 命令控制服务的名称。服务必须是唯一的(两个服务不能共享相同的名称),并且理想情况下,应该避免在名称中使用空格。

display

服务的显示名称。这是您在服务小程序中看到的名称。

description

服务的详细描述。这是您在服务小程序中看到的描述。

user

您希望服务在其下运行的用户帐户的名称。如果省略,则服务将作为 LocalSystem 帐户运行。如果指定了用户名,则还必须提供密码。

password

user 对应的密码。

path

启动服务时将启动的可执行模块的完整路径。如果省略,则将使用当前 PHP 进程的路径。

params

服务启动时传递给服务的命令行参数。如果要将 PHP 脚本作为服务运行,则第一个参数应为要运行的 PHP 脚本的完整路径。如果脚本名称或路径包含空格,则使用 " 将 PHP 脚本的完整路径括起来。

load_order

控制加载顺序。这尚未完全支持。

svc_type

设置服务类型。如果省略,则默认值为 WIN32_SERVICE_WIN32_OWN_PROCESS。除非您知道自己在做什么,否则不要更改此设置。

start_type

指定服务应如何启动。默认值为 WIN32_SERVICE_AUTO_START,这意味着机器启动时将启动该服务。

error_control

通知 SCM 当它检测到服务出现问题时应该做什么。默认值为 WIN32_SERVER_ERROR_IGNORE。更改此值尚不支持。

delayed_start

如果将 delayed_start 设置为 true,则这将通知 SCM 该服务应在其他自动启动服务启动后以及稍作延迟后启动。

任何服务都可以标记为延迟自动启动服务;但是,此设置仅在服务的 start_typeWIN32_SERVICE_AUTO_START 时才有效。

此设置仅适用于 Windows Vista 和 Windows Server 2008 或更高版本。

base_priority

为了减少对处理器利用率的影响,可能需要将基本优先级设置为低于正常的级别。

可以将 base_priority 设置为 Win32 基本优先级类 中定义的常量之一。

dependencies

要定义服务的依赖项,可能需要将此参数设置为服务名称的数组列表。

recovery_delay

此参数定义故障与执行恢复操作之间的时间延迟。该值以毫秒为单位。

默认值为 60000。

recovery_action_1

第一次发生故障时将执行的操作。默认值为 WIN32_SC_ACTION_NONE

可以将 recovery_action_1 设置为 Win32 恢复操作 中定义的常量之一。

recovery_action_2

第二次发生故障时将执行的操作。默认值为 WIN32_SC_ACTION_NONE

可以将 recovery_action_2 设置为 Win32 恢复操作 中定义的常量之一。

recovery_action_3

在后续故障中将执行的操作。默认值为 WIN32_SC_ACTION_NONE

可以将 recovery_action_3 设置为 Win32 恢复操作 中定义的常量之一。

recovery_reset_period

故障计数将在参数中定义的延迟后重置。延迟以秒为单位。

默认值为 86400

recovery_enabled

将此参数设置为 true 以启用恢复设置,设置为 false 以禁用。

默认值为 false

recovery_reboot_msg

将此参数设置为定义在重新引导之前保存到 Windows 事件日志中的消息。仅当某个操作设置为 WIN32_SC_ACTION_REBOOT 时才使用。

recovery_command

将此参数设置为定义在某个操作定义为 WIN32_SC_ACTION_RUN_COMMAND 时执行的命令。

machine

要在其上创建服务的可选机器名称。如果省略,它将使用本地机器。

返回值

不返回值。

在 1.0.0 版之前,如果成功则返回 WIN32_NO_ERROR,如果参数存在问题或发生 Win32 错误代码 则返回 false

错误/异常

如果 service 参数的值为空,则会抛出 ValueError

如果 path 参数的值丢失或为空,则会抛出 ValueError

如果 svc_type 参数的值错误,则会抛出 ValueError

如果 start_type 参数的值错误,则会抛出 ValueError

如果 error_control 参数的值错误,则会抛出 ValueError

如果 base_priority 参数的值错误,则会抛出 ValueError

如果 recovery_delay 参数的值不在 0 和 PHP_INT_MAX 之间,则会抛出 ValueError

如果 recovery_action_1 参数的值错误,则会抛出 ValueError

如果 recovery_action_2 参数的值错误,则会抛出 ValueError 异常。

如果 recovery_action_3 参数的值错误,则会抛出 ValueError 异常。

如果 recovery_reset_period 参数的值不在 0 和 PHP_INT_MAX 之间,则会抛出 ValueError 异常。

发生错误时,会抛出 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 添加了 dependenciesrecovery_delayrecovery_action_1recovery_action_2recovery_action_3recovery_reset_periodrecovery_enabledrecovery_reboot_msgrecovery_command 参数。

示例

示例 #1 win32_create_service() 示例

创建一个名为 'dummyphp' 的服务。

<?php
$x
= win32_create_service(array(
'service' => 'dummyphp', // 服务名称
'display' => 'sample dummy PHP service', // 简短描述
'description' => 'This is a dummy Windows service created using PHP.', // 详细描述
'params' => '"' . __FILE__ . '" run', // 脚本路径和参数
));
debug_zval_dump($x);
?>

示例 #2 带有依赖项的 win32_create_service() 示例

创建一个名为 'dummyphp' 并带有依赖项的服务。

<?php
$x
= win32_create_service(array(
'service' => 'dummyphp', // 服务名称
'display' => 'sample dummy PHP service', // 简短描述
'description' => 'This is a dummy Windows service created using PHP.', // 详细描述
'params' => '"' . __FILE__ . '" run', // 脚本路径和参数
'dependencies' => array("Netman"), // 依赖项列表
));
debug_zval_dump($x);
?>

示例 #3 带有恢复设置的 win32_create_service() 示例

创建一个名为 'dummyphp' 并带有恢复设置的服务。

<?php
$x
= win32_create_service(array(
'service' => 'dummyphp', // 服务名称
'display' => 'sample dummy PHP service', // 简短描述
'description' => 'This is a dummy Windows service created using PHP.', // 详细描述
'params' => '"' . __FILE__ . '" run', // 脚本路径和参数
'recovery_delay' => 120000, // 恢复操作在 2 分钟后执行
'recovery_action_1' => WIN32_SC_ACTION_RESTART, // 第一次失败时,重启服务
'recovery_action_2' => WIN32_SC_ACTION_RUN_COMMAND, // 第二次失败时,执行命令
'recovery_action_3' => WIN32_SC_ACTION_NONE, // 其他失败时,不执行任何操作
'recovery_reset_period' => 86400, // 1 天后重置失败计数器
'recovery_enabled' => true, // 启用恢复参数
'recovery_reboot_msg' => null, // 不定义重启消息,此处不需要
'recovery_command' => "c:\clean-service.bat", // 当操作为 WIN32_SC_ACTION_RUN_COMMAND 时,执行此命令
));
debug_zval_dump($x);
?>

添加注释

用户贡献的注释 2 个注释

pauljamesthomson at gmail dot com
17 年前
其他 start_type 值

0x00000002: 系统启动期间由服务控制管理器自动启动的服务。有关更多信息,请参阅自动启动服务。

0x00000000: 由系统加载程序启动的设备驱动程序。此值仅对驱动程序服务有效。

0x00000003: 当进程调用 win32_start_service() 函数时,由服务控制管理器启动的服务。

0x00000004: 无法启动的服务。尝试启动服务会导致错误代码

0x00000001: 由 IoInitSystem 函数启动的设备驱动程序。此值仅对驱动程序服务有效。

我可以确认 0x00000003 按预期工作(服务已创建,但必须手动启动)。

更多信息

http://msdn2.microsoft.com/en-us/library/ms682450.aspx
匿名
14 年前
[创建 Windows 服务的示例。请先评估代码,并自行承担风险使用!]



<?php

//无超时设置,立即刷新内容
set_time_limit(0);
ob_implicit_flush();

//服务设置
$phpPath = "D:\\php\\php5.2.9";
$ServiceName = 'phpServiceName';
$ServiceDisplay = 'phpDisplayName';

//Windows 服务控制
$ServiceAction = "status";
//$ServiceAction = "debug";
if ( isset($_GET['ServiceAction']) and strlen($_GET['ServiceAction']) ) {
$ServiceAction = addslashes($_GET['ServiceAction']);
} else if ( isset(
$argv) and isset($argv[1]) and strlen($argv[1]) ) {
$ServiceAction = $argv[1];
}
if(
$ServiceAction == "status" ) {
$ServiceStatus = win32_query_service_status($ServiceName);
if (
$ServiceStatus['CurrentState'] == WIN32_SERVICE_STOPPED ) {
echo
"服务已停止\n\n";
} else if (
$ServiceStatus['CurrentState'] == WIN32_SERVICE_START_PENDING ) {
echo
"服务正在启动\n\n";
} else if (
$ServiceStatus['CurrentState'] == WIN32_SERVICE_STOP_PENDING ) {
echo
"服务正在停止\n\n";
} else if (
$ServiceStatus['CurrentState'] == WIN32_SERVICE_RUNNING ) {
echo
"服务正在运行\n\n";
} else if (
$ServiceStatus['CurrentState'] == WIN32_SERVICE_CONTINUE_PENDING ) {
echo
"服务正在继续\n\n";
} else if (
$ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSE_PENDING ) {
echo
"服务正在暂停\n\n";
} else if (
$ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSED ) {
echo
"服务已暂停\n\n";
} else{
echo
"服务状态未知\n\n";
}
exit;
} else if (
$ServiceAction == "install" ) {
//安装 Windows 服务
win32_create_service( Array(
'service' => $ServiceName,
'display' => $ServiceDisplay,
'params' => __FILE__ . " run",
'path' => $phpPath."\\php.exe",
));
echo
"服务已安装\n\n";
exit;
} else if (
$ServiceAction == "uninstall" ) {
//删除 Windows 服务
win32_delete_service($ServiceName);
echo
"服务已删除\n\n";
exit;
} else if(
$ServiceAction == "start") {
//启动 Windows 服务
win32_start_service($ServiceName);
echo
"服务已启动\n\n";
exit;
} else if(
$ServiceAction == "stop" ) {
//停止 Windows 服务
win32_stop_service($ServiceName);
echo
"服务已停止\n\n";
exit;
} else if (
$ServiceAction == "run" ) {
//运行 Windows 服务
win32_start_service_ctrl_dispatcher($ServiceName);
win32_set_service_status(WIN32_SERVICE_RUNNING);
} else if (
$ServiceAction == "debug" ) {
//调试 Windows 服务
set_time_limit(10);
} else {
exit();
}

//服务器循环
while (1) {
//处理 Windows 服务请求
usleep(100*1000);
if (
$ServiceAction == "run" ) {
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(1);
echo
"\n<BR>在此处编写您的代码";
}

//退出
if ( $ServiceAction == "run" ) {
win32_set_service_status(WIN32_SERVICE_STOPPED);
}
exit();
?>
To Top