win32_create_service

(PECL win32service >=0.1.0)

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

说明

win32_create_service(array $details, string $machine = ?): 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,如果参数有问题,则返回 false,如果失败,则返回 Win32 错误代码

错误/异常

如果 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
匿名
13 年前
[创建 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