PHP Conference Japan 2024

win32_start_service_ctrl_dispatcher

(PECL win32service >=0.1.0)

win32_start_service_ctrl_dispatcher將腳本註冊到 SCM,使其可以作為指定名稱的服務運作

說明

win32_start_service_ctrl_dispatcher(字串 $name, 布林值 $gracefulMode = true):

當透過服務控制管理員 (SCM) 啟動時,服務行程需要向其「報到」以建立服務監控和通訊設施。此函式透過產生一個執行緒來處理與服務控制管理員的底層通訊,以執行報到。

服務程序啟動後,應該執行兩項操作。首先,告知服務控制管理器服務正在運行。這可以通過使用 **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(
"I'm probably not running under the service control manager");
}

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 則筆記

andrea
15 年前
如果字串有空格,請在 "" 之間插入參數值

<?php
// 首先您需要創建一個服務,您只需要執行一次
/*
win32_create_service(array(
'service' => 'myphpservice',
'display' => '我的 PHP 服務',
'params' => '"c:\\my folder\myphpservice.php"',
'path' => 'c:\\PHP\\php.exe'));
*/
?>
dylan at nopower dot org
17 年前
<?php
// 首先您需要建立一個服務,只需要執行一次
/*
win32_create_service(array(
'service' => 'myphpservice',
'display' => '我的 PHP 服務',
'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);
?>
Guibod
17 年前
不要在程式碼太後面才呼叫 "win32_start_service_ctrl_dispatcher"。你會觸發 #2186 錯誤:「服務沒有回應控制函式。」(來自命令列)或 #1053 錯誤:「服務未及時回應啟動或控制要求。」(來自服務 GUI)。

盡量不要像我一樣在將 php 腳本註冊為服務之前載入一堆 PEAR 類別。

另一個好提示,要取得詳細的返回碼版本,您可以從命令列呼叫 "NET HELPMSG ###",其中 ### 是您的錯誤碼。
To Top