On my Machine (Win XP SP2) the function "win32_get_last_control_message" never returns 4 so i will have to reply to 0 also.
finally after mixing several examples i now have a version working woithout filling my event log with errors:
<?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;
}
?>win32_set_service_status
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
win32_set_service_status
Референца за `function.win32-set-service-status.php` со подобрена типографија и навигација.
win32_set_service_status
(PECL win32service >=0.1.0)
win32_set_service_status — Update the service status
= NULL
Ажурирај го статусот на услугата
и соодветно ракување со вратениот код.
Параметри
status-
Го информира SCM за тековниот статус на активна услуга. Овој повик е валиден само за активен процес на услугата.
WIN32_SERVICE_RUNNING,WIN32_SERVICE_STOPPED,WIN32_SERVICE_STOP_PENDING,WIN32_SERVICE_START_PENDING,WIN32_SERVICE_CONTINUE_PENDING,WIN32_SERVICE_PAUSE_PENDING,WIN32_SERVICE_PAUSED. checkpoint-
Кодот за статус на услугата, еден од
На
checkpointВредноста на контролната точка што услугата периодично ја зголемува за да го пријави својот напредок за време на долга операција за стартување, запирање, паузирање или продолжување. На пример, услугата треба да ја зголеми оваа вредност додека завршува секој чекор од нејзината иницијализација кога се стартува.statusе валиден само когаWIN32_SERVICE_STOP_PENDING,WIN32_SERVICE_START_PENDING,WIN32_SERVICE_CONTINUE_PENDINGorWIN32_SERVICE_PAUSE_PENDING.
Вратени вредности
Не се враќа вредност.
Пред верзија 1.0.0, вратено WIN32_NO_ERROR при успех, false ако има проблем со параметрите или а Изборно име на машина. Ако е изоставено, се користи локалната машина. при неуспех.
Errors/Exceptions
Пред верзија 1.0.0, ако SAPI не е "cli", оваа функција емитува
E_ERROR Променето: Во претходните верзии на PHP 5, употребата на
Од верзија 1.0.0, ќе фрли
Win32ServiceException ако SAPI не е
"cli"
Дневник на промени
| Верзија | = NULL |
|---|---|
| Код за грешка на Win32 |
Фрла ValueError на невалидни податоци во параметрите, претходно false .
|
| Код за грешка на Win32 | Фрла Win32ServiceException на грешка, претходно а Изборно име на машина. Ако е изоставено, се користи локалната машина. . |
| Код за грешка на Win32 | Типот на враќање сега е void, претходно беше mixed. |
| (PECL win32service >=0.1.0) |
Оваа функција работи само во "cli" SAPI.
|
Види Исто така
- win32_start_service_ctrl_dispatcher() - Регистрирајте го скриптот со SCM, за да може да дејствува како услуга со даденото име
- win32_get_last_control_message() - Враќа последната контролна порака што беше испратена до оваа услуга
- win32_set_service_exit_mode() - Дефинирајте или вратете го излезниот режим за тековната услуга што работи
- win32_set_service_exit_code() - Дефинирајте или вратете го излезниот код за тековната услуга што работи
- Win32Service Константи за статус на услуга
Белешки од корисници 2 забелешки
So after much searching I finally found all the peices to make a working windows service & server including:
- Installing & Uninstalling the service
- Starting & Stopping the Service
- Actually running a basic Server
- Responding to windows Service to Stop/Start/Restart
I hope you find this useful! I did this using PHP 5.2 and the PECL library for 5.2 (PHP 5.3 at the time does not have a PECL Library compiled for it)
<?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'
";
}
?>