2024 日本 PHP 研討會

win32_set_service_status

(PECL win32service >=0.1.0)

win32_set_service_status更新服務狀態

說明

win32_set_service_status(int $status, int $checkpoint = 0): void

通知 SCM 正在執行的服務的目前狀態。此呼叫僅對正在執行的服務流程有效。

警告

自 0.2.0 版本起,此函數僅在 "cli" SAPI 中有效。在其他 SAPI 中,此函數已被停用。

參數

status

服務狀態碼,可為下列其中之一:WIN32_SERVICE_RUNNINGWIN32_SERVICE_STOPPEDWIN32_SERVICE_STOP_PENDINGWIN32_SERVICE_START_PENDINGWIN32_SERVICE_CONTINUE_PENDINGWIN32_SERVICE_PAUSE_PENDINGWIN32_SERVICE_PAUSED

checkpoint

服務在長時間的啟動、停止、暫停或繼續操作期間定期遞增的檢查點值,用於回報其進度。例如,服務在啟動時,應在完成初始化的每個步驟時遞增此值。

checkpoint 參數僅在 status 參數為 WIN32_SERVICE_STOP_PENDINGWIN32_SERVICE_START_PENDINGWIN32_SERVICE_CONTINUE_PENDINGWIN32_SERVICE_PAUSE_PENDING 時有效。

返回值

無返回值。

在 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.2.0 此函數僅在 "cli" SAPI 中有效。

參見

新增註釋

使用者貢獻的筆記 2 則筆記

3
m dot hald at surfto dot ch
16 年前
在我的機器上 (Win XP SP2),函式 "win32_get_last_control_message" 永遠不會返回 4,所以我必須回應 0。

終於,在混合了幾個範例之後,我現在有了一個可以在不讓我的事件日誌充滿錯誤的情況下運作的版本。

<?php

/*
* PHP SAMPLE TEMPLATE
*/

/*
* APP MAIN FUNCTION
* Called each second after the function last time finished
* Should not take longer than max 20 seconds to execute
* ELSE you should call NTServiceResponder(); at least each 20 secs
* WARNING: NTServiceResponder will exit; if there was a STOP request
*/
function Service_Main()
{
// YOU APPLICATION CODE HERE !!!
sleep(1); // dummy something
}

/********************************************************************
*
* SERVICE CONTROLLING
*
********************************************************************/

$SERVICE_NAME = "phptestservice";
$SERVICE_DISPLAY = "Test Service with PHP";

// so u can get: $SERVICE_PATH_PARTS["dirname"] $SERVICE_PATH_PARTS["basename"] $SERVICE_PATH_PARTS["extension"]
$SERVICE_PATH_PARTS = pathinfo(__FILE__);

$SERVICE_PARAMS = " run";

if (!isset(
$argv[1]))
{
die(
"this application need to be installed as a service.\n run with param install");
}

if (
$argv[1] == 'install')
{
$x = win32_create_service(array(
'service' => $SERVICE_NAME,
'display' => $SERVICE_DISPLAY,
'params' => __FILE__ . $SERVICE_PARAMS,
//'path' => $SERVICE_PATH_PARTS["dirname"] . '\php.exe'
));
debug_zval_dump($x);
exit;
}
else if (
$argv[1] == 'uninstall')
{
$x = win32_delete_service('dummyphp');
debug_zval_dump($x);
exit;
}
else if (
$argv[1] != 'run')
{
die(
"bogus args, needs to run as service");
}

// Connect to service dispatcher and notify that startup was successful
if (!win32_start_service_ctrl_dispatcher($SERVICE_NAME)) die('Could not connect to service :'.$SERVICE_NAME);
win32_set_service_status(WIN32_SERVICE_RUNNING);

// Main Server Loop
while (1)
{
NTServiceResponder();

// Main script goes here
Service_Main();

sleep(1); // at least 1 sec delay per loop
}
win32_set_service_status(WIN32_SERVICE_STOPPED);

/*
* Response to NTServiceRequests
*/
function NTServiceResponder()
{

switch (
win32_get_last_control_message())
{
case
0: // PATCH for: seems never to go to 4 (WIN32_SERVICE_CONTROL_INTERROGATE)
win32_set_service_status(WIN32_SERVICE_RUNNING);
return
TRUE;
break;
case
WIN32_SERVICE_CONTROL_CONTINUE:
return
TRUE; // "Continue"
case WIN32_SERVICE_CONTROL_INTERROGATE:
win32_set_service_status(WIN32_SERVICE_RUNNING);
return
TRUE; // Respond with status
case WIN32_SERVICE_CONTROL_STOP:
win32_set_service_status(WIN32_SERVICE_STOPPED);
exit;
// Terminate script
default:
win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
}

return
FALSE;
}

?>
-1
paul_nelson57071 at yahoo dot com
14 年前
經過一番搜尋,我終於找到了所有組成一個可運作的 Windows 服務和伺服器的部分,包括:
- 安裝和解除安裝服務
- 啟動和停止服務
- 實際執行一個基本伺服器
- 回應 Windows 服務的停止/啟動/重新啟動

我希望你覺得這很有用!我使用 PHP 5.2 和 5.2 的 PECL 函式庫完成這個功能(當時的 PHP 5.3 沒有編譯好的 PECL 函式庫)。

<?php
//Service Settings
$Service = 'MyServiceFinal';
$Display = 'My PHP Service';

//Server Settings
$host = '127.0.0.1'; //Bind to IP #
$port = 23; //On port #
$max = 20; //Maximum Clients


//Exit if no start-up argument is passed
if (!isset($argv[1])){ShowHelp(); exit;}

//Create Windows Service
if ($argv[1] == 'install') {
$x = win32_create_service(array(
'service' => $Service,
'display' => $Service,
'params' => __file__ . ' run',
'path' => 'c:\\php\\php.exe',
));
debug_zval_dump($x);
echo
"Service Installed\n\n";
exit;

//Remove Windows Service
} else if ($argv[1] == 'uninstall') {
$x = win32_delete_service($Service);
debug_zval_dump($x);
echo
"Service Removed\n\n";
exit;

//Start Windows Service
} elseif($argv[1] == "start") {
$x = win32_start_service($Service);
debug_zval_dump($x);
echo
"Service Started\n\n";
exit;

//Stop Windows Service
} elseif($argv[1] == "stop") {
$x = win32_stop_service($Service);
debug_zval_dump($x);
echo
"Service Stopped\n\n";
exit;

//Unkown Command
} else if ($argv[1] != 'run') {
ShowHelp(); exit();
}

//Tell windows the service has started...
if (!win32_start_service_ctrl_dispatcher($Service)) die("Could not connect to service : $Service");
win32_set_service_status(WIN32_SERVICE_RUNNING);

// No timeouts, flush content immediatly
set_time_limit(0);
ob_implicit_flush();

//Server Loop
while (1) {
usleep(500);

//Handle Windows Service Request
switch (win32_get_last_control_message()) {
case
WIN32_SERVICE_CONTROL_CONTINUE: break; // Continue server routine
case WIN32_SERVICE_CONTROL_INTERROGATE: win32_set_service_status(WIN32_NO_ERROR); break; // Respond with status
case WIN32_SERVICE_CONTROL_STOP: win32_set_service_status(WIN32_SERVICE_STOPPED); exit; // Terminate script
default: win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
}
//Acutal Server Code

}

//Clean up and Exit
win32_set_service_status(WIN32_SERVICE_STOPPED);
exit;

//*************** FUNCTIONS ***************
function ShowHelp(){
echo
"Usage:
install:\t installs servce
uninstall:\t deletes service
start:\t\t Start the windows service
stop:\t\t Stops the windows service
run:\t\t called by CMS to run the service

For information on code numbers type 'net helpmsg xxxx'
EXAMPEL: 'net helpmsg 1072'

"
;
}
?>
To Top