win32_start_service_ctrl_dispatcher

(PECL win32service >=0.1.0)

win32_start_service_ctrl_dispatcherRegistra un script con SCM, por lo que puede ser interpretado como un servicio con el nombre dado

Descripción

win32_start_service_ctrl_dispatcher(string $name, bool $gracefulMode = true): void

Cuando se ejecuta a través del Gestionador de Control de Servicio, un proceso de servicio debe "registrarse" con él para establecer un servicio de supervisión y comunicación eficiente. Esta función realiza el registro iniciando un hilo para manejar las comunicaciones de bajo nivel con el Gestionador de Control de Servicio.

Una vez iniciado, el proceso del servicio debe hacer dos cosas. La primera es informar al Service Control Manager que el servicio está en ejecución. La segunda es llamar a la función win32_set_service_status() con la constante WIN32_SERVICE_RUNNING. Si necesita lanzar procesos largos antes de que el servicio se inicie, puede usar la constante WIN32_SERVICE_START_PENDING. La segunda es continuar verificando con el Service Control Manager para determinar si el servicio se detiene o no. Esto implica llamar periódicamente a la función win32_get_last_control_message() y tratar el código devuelto.

Precaución

Desde la versión 0.2.0, esta función solo funciona en línea de comandos. Está deshabilitada en otros casos.

Parámetros

name

El nombre corto del servicio, como se registra con win32_create_service().

gracefulMode

true para la salida correcta. false para la salida con error. Consulte win32_set_service_exit_mode() para más detalles.

Valores devueltos

No devuelve ningún valor.

Antes de la versión 1.0.0, Devuelve WIN32_NO_ERROR en caso de éxito, false si hay un problema con los parámetros o Código de error Win32 en caso de error.

Errores/Excepciones

Antes de la versión 1.0.0, si esta función se utiliza fuera del SAPI "cli", se emitirá un error E_ERROR.

A partir de la versión 1.0.0, lanzará una Win32ServiceException si el SAPI no es "cli"

Historial de cambios

Versión Descripción
PECL win32service 1.0.0 Lanzará una ValueError si un argumento es inválido, anteriormente false era retornado.
PECL win32service 1.0.0 Lanzará una Win32ServiceException en caso de error, anteriormente un Código de error Win32 era retornado.
PECL win32service 1.0.0 El tipo de retorno es ahora void, anteriormente era mixed.
PECL win32service 0.4.0 Se añadió el argumento gracefulMode.
PECL win32service 0.2.0 Esta función solo funciona en línea de comandos ("cli" SAPI).

Ejemplos

Ejemplo #1 Ejemplo con win32_start_service_ctrl_dispatcher()

Verifica si el servicio funciona bajo SCM.

<?php
if (!win32_start_service_ctrl_dispatcher('dummyphp')) {
die(
"Probablemente no estoy funcionando bajo el Gestionador de Control de Servicio");
}

win32_set_service_status(WIN32_SERVICE_START_PENDING);

// Algunos procesos largos a recuperar mientras el servicio funciona.

win32_set_service_status(WIN32_SERVICE_RUNNING);

while (
WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
# Realice su trabajo aquí.
# Intente no tomar más de 30 segundos antes de devolver.
}
?>

Ver también

add a note

User Contributed Notes 3 notes

up
0
andrea
15 years ago
Insert value of params between " if the string have a space:

<?php
// First you need to create a service, you only need to do this once
/*
win32_create_service(array(
'service' => 'myphpservice',
'display' => 'My PHP Service',
'params' => '"c:\\my folder\myphpservice.php"',
'path' => 'c:\\PHP\\php.exe'));
*/
?>
up
-1
dylan at nopower dot org
17 years ago
<?php
// First you need to create a service, you only need to do this once
/*
win32_create_service(array(
'service' => 'myphpservice',
'display' => 'My PHP Service',
'params' => 'c:\\myphpservice.php',
'path' => 'c:\\PHP\\php.exe'));
*/

$myservicename = 'myphpservice';

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

// Main Server Loop
while (1) {
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
}

// Main script goes here

sleep(10); // Run every 10 seconds
}
win32_set_service_status(WIN32_SERVICE_STOPPED);
?>
up
-2
Guibod
17 years ago
Don't try to call "win32_start_service_ctrl_dispatcher" too late in your code. You'd trigger a #2186 error : "The service is not responding to the control function." (from commande line) or a #1053 error : "The service did not respond to the start or control request in a timely fashion." (from services GUI).

Try not to load a bunch of PEAR classes before to register php script as Service like I did.

Another good hint, to get a verbose version of the return code, you can call "NET HELPMSG ###" from command line where ### is your error code.
To Top