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_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_PENDING или WIN32_SERVICE_PAUSE_PENDING.

Возвращаемые значения

Функция не возвращает значения после выполнения.

До версии 1.0.0, Возвращает WIN32_NO_ERROR в случае успешного завершения , false если была обнаружена проблема с параметрами или код ошибки Win32 при неудачном завершении работы.

Ошибки

До версии 1.0.0, если SAPI не "cli", функция выдавала ошибку уровня E_ERROR.

Начиная с версии 1.0.0, выбрасывает Win32ServiceException, если SAPI не "cli"

Список изменений

Версия Описание
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.

Смотрите также

add a note add a note

User Contributed Notes 2 notes

up
1
m dot hald at surfto dot ch
16 years ago
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;
}

?>
up
0
paul_nelson57071 at yahoo dot com
14 years ago
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'
   
    "
;
}
?>
To Top