[An example of how to create a Windows service. Evaluate code first and use at your own risk!]
<?php
//No timeouts, Flush Content immediatly
set_time_limit(0);
ob_implicit_flush();
//Service Settings
$phpPath = "D:\\php\\php5.2.9";
$ServiceName = 'phpServiceName';
$ServiceDisplay = 'phpDisplayName';
//Windows Service Control
$ServiceAction = "status";
//$ServiceAction = "debug";
if ( isset($_GET['ServiceAction']) and strlen($_GET['ServiceAction']) ) {
$ServiceAction = addslashes($_GET['ServiceAction']);
} else if ( isset($argv) and isset($argv[1]) and strlen($argv[1]) ) {
$ServiceAction = $argv[1];
}
if( $ServiceAction == "status" ) {
$ServiceStatus = win32_query_service_status($ServiceName);
if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOPPED ) {
echo "Service Stopped\n\n";
} else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_START_PENDING ) {
echo "Service Start Pending\n\n";
} else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOP_PENDING ) {
echo "Service Stop Pending\n\n";
} else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_RUNNING ) {
echo "Service Running\n\n";
} else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_CONTINUE_PENDING ) {
echo "Service Continue Pending\n\n";
} else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSE_PENDING ) {
echo "Service Pause Pending\n\n";
} else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSED ) {
echo "Service Paused\n\n";
} else{
echo "Service Unknown\n\n";
}
exit;
} else if ( $ServiceAction == "install" ) {
//Install Windows Service
win32_create_service( Array(
'service' => $ServiceName,
'display' => $ServiceDisplay,
'params' => __FILE__ . " run",
'path' => $phpPath."\\php.exe",
));
echo "Service Installed\n\n";
exit;
} else if ( $ServiceAction == "uninstall" ) {
//Remove Windows Service
win32_delete_service($ServiceName);
echo "Service Removed\n\n";
exit;
} else if( $ServiceAction == "start") {
//Start Windows Service
win32_start_service($ServiceName);
echo "Service Started\n\n";
exit;
} else if( $ServiceAction == "stop" ) {
//Stop Windows Service
win32_stop_service($ServiceName);
echo "Service Stopped\n\n";
exit;
} else if ( $ServiceAction == "run" ) {
//Run Windows Service
win32_start_service_ctrl_dispatcher($ServiceName);
win32_set_service_status(WIN32_SERVICE_RUNNING);
} else if ( $ServiceAction == "debug" ) {
//Debug Windows Service
set_time_limit(10);
} else {
exit();
}
//Server Loop
while (1) {
//Handle Windows Service Request
usleep(100*1000);
if ( $ServiceAction == "run" ) {
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);
}
}
//User Loop
sleep(1);
echo "\n<BR>YOUR CODE HERE";
}
//Exit
if ( $ServiceAction == "run" ) {
win32_set_service_status(WIN32_SERVICE_STOPPED);
}
exit();
?>
win32_create_service
(PECL win32service SVN)
win32_create_service — Crea una nueva entrada de servicio en la base de datos del ACS
Descripción
Parámetros
-
details -
Una matriz con los detalles del servicio:
-
service -
El nombre corto del servicio. Éste es el nombre que se debe usar para controlar el servicio utilizando el comando net. El servicio debe ser único (dos servicios no pueden compartir el mismo nombre), y lo ideal sería evitar que el nombre contenga espacios.
-
display -
El nombre para mostrar del servicio. Éste es el nombre que se verá en la Aplicación de Servicios.
-
description -
La descripción larga del servicio. Ésta es la descripción que verá en el Services Applet.
-
user -
El nombre de la cuenta de usuario bajo la cuál se quiere ejecutar el servicio. Si se omite, el servicio se ejecutará como la cuenta LocalSystem. Si se especifica el nombre de usuario, también se debe proporcionar una contraseña.
-
password -
La contraseña que se corresponde con
user. -
path -
La ruta completa de módulo ejecutable que será lanzado cuando el servicio es iniciado. Si se omite, se usará la ruta del proceso de PHP actual.
-
params -
Parámetros de línea de comandos a pasar al servicio cuando se inicia. Si quiere ejecutar un script de PHP como un servicio, el primer parámetro debería ser la ruta completa del script de PHP que intenta ejecutar. Si el nombre del script o la ruta contiene espacios encierre la ruta completa del script PHP con ".
-
load_order -
Controla el orden de carga. Ésto aún no está completamente soportado.
-
svc_type -
Establece el tipo de servicio. Si se omite, el valor por defecto es
WIN32_SERVICE_WIN32_OWN_PROCESS. No cambie esto a menos que sepa lo que está haciendo. -
start_type -
Especifica cómo debería iniciarse el servicio. Por defecto es
WIN32_SERVICE_AUTO_STARTlo que significa que el servicio será lanzado cuando se encienda la máquina. -
error_control -
Informa al ACS qué debería hacer cuando detecta un problema con el servicio. Por defecto es
WIN32_SERVER_ERROR_IGNORE. El cambio de este valor no está aún soportado completamente. -
delayed_start -
Si
delayed_startestá establecido aTRUE, informará al SCM que este servicio debería ser iniciado después que otros servicios con autoinicio, más una pequeña demora.Cualquier servicio puede ser marcado como un servicio con autoinicio demorado; sin embargo este ajuste no tiene efecto a menos que el parámetro
start_typedel servicio seaWIN32_SERVICE_AUTO_START.Este ajuste sólo es aplicable en Windows Vista y Windows Server 2008 o superior.
-
base_priority -
Para reducir el impacto en el uso del procesador, puede ser necesario para establecer una prioridad base más baja de lo normal.
base_prioritypuede establecerse a una de las constantes definidas en Clases de Prioridad Base de Win32.
-
-
machine -
El nombre opcional de la máquina en la que quiere crear el servicio. Si se omite, se usará la máquina local.
Valores devueltos
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.
Ejemplos
Ejemplo #1 Un ejemplo de win32_create_service()
Crear un servicio con el nombre abreviado 'dummyphp'.
<?php
$x = win32_create_service(array(
'service' => 'dummyphp', # el nombre de su servicio
'display' => 'ejemplo de servicio PHP', # descripción abreviada
'description' => 'Este es un servicio de Windows creado usando PHP.', # descripción larga
'params' => '"' . __FILE__ . '" run', # ruta del script y parámetros
));
debug_zval_dump($x);
?>
Ver también
- win32_delete_service() - Borra una entrada de servicio de la base de datos del ACS
- Clases de Prioridad Base de Win32
- Códigos de Error de Win32
Other start_type values:
0x00000002: A service started automatically by the service control manager during system startup. For more information, see Automatically Starting Services.
0x00000000: A device driver started by the system loader. This value is valid only for driver services.
0x00000003: A service started by the service control manager when a process calls the win32_start_service() function.
0x00000004: A service that cannot be started. Attempts to start the service result in the error code
0x00000001: A device driver started by the IoInitSystem function. This value is valid only for driver services.
I can confirm that 0x00000003 works as expected (service is created, but must be started manually).
More here:
http://msdn2.microsoft.com/en-us/library/ms682450.aspx
