PHP 日本研討會 2024

win32_create_service

(PECL win32service >=0.1.0)

win32_create_service在 SCM 資料庫中建立新的服務項目

說明

win32_create_service(array $details, string $machine = null): void

嘗試將服務新增到 SCM 資料庫中。 需要管理員權限才能成功。

參數

details

服務詳細資訊的陣列

service

服務的簡短名稱。 這是您將用來使用 net 命令控制服務的名稱。 服務必須是唯一的(沒有兩個服務可以共用相同的名稱),並且理想情況下應避免在名稱中使用空格。

display

服務的顯示名稱。 這是您將在「服務」小程式中看到的名稱。

description

服務的詳細說明。 這是您將在「服務」小程式中看到的說明。

user

您希望服務在其下執行的使用者帳戶名稱。 如果省略,則服務將以 LocalSystem 帳戶執行。 如果指定了使用者名稱,您還必須提供密碼。

password

user 對應的密碼。

path

服務啟動時將啟動的可執行模組的完整路徑。 如果省略,將使用目前 PHP 程序的路徑。

params

服務啟動時要傳遞給服務的命令列參數。 如果您想將 PHP 指令碼作為服務執行,則第一個參數應該是要執行的 PHP 指令碼的完整路徑。 如果指令碼名稱或路徑包含空格,請用 " 包裹 PHP 指令碼的完整路徑。

load_order

控制 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' => '這是一個使用 PHP 建立的虛擬 Windows 服務。', // 詳細描述
'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' => '這是一個使用 PHP 建立的虛擬 Windows 服務。', // 詳細描述
'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' => '這是一個使用 PHP 建立的虛擬 Windows 服務。', // 詳細描述
'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