[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 — Crée une nouvelle entrée pour service dans la base de données SCM
Description
Liste de paramètres
-
details -
Un tableau des détails des services :
-
service -
Le nom court du service. C'est le nom que vous utiliserez pour contrôler le service en utilisant la commande net. Le service doit être unique (deux services ne peuvent partager le même nom), et idéalement, devrait éviter d'avoir des espaces dans son nom.
-
display -
Le nom d'affichage du service. C'est le nom que vous verrez dans l'Applet Services.
-
description -
La description longue du service. C'est la description que vous verrez dans l'Applet des services.
-
user -
Le nom de l'utilisateur sous lequel vous voulez que le service s'exécute. Si oublié, le service fonctionnera en tant que LocalSystem. Si le nom de l'utilisateur est spécifié, vous devez aussi fournir un mot de passe.
-
password -
Le mot de passe qui correspond à
user. -
path -
Le chemin complet au module exécutable qui sera démarré lorsque le service est démarré. Si oublié, le chemin du processus courant de PHP sera utilisé.
-
params -
Paramètres de commande à passer au service lorsqu'il démarre. Si vous voulez exécuter un script PHP en tant que service, alors le premier paramètre devrait être le chemin complet au script PHP que vous prévoyez exécuter. Si le nom du script ou le chemin contiennent des espaces, alors, entourez le chemin complet du script PHP par des "
-
load_order -
Contrôle le load_order. Cela n'est pas encore complètement supporté.
-
svc_type -
Fixe le type de service. Si oublié, la valeur par défaut est
WIN32_SERVICE_WIN32_OWN_PROCESS. Ne changez pas ceci à moins que vous savez vraiment ce que vous faites. -
start_type -
Spécifie comment le service devrait être démarré. La valeur par défaut est
WIN32_SERVIDE_AUTO_STARTqui signifie que le service sera démarré lorsque la machine démarrera. -
error_control -
Informe le SCM à propos de ce qu'il devrait faire lorsqu'il détecte un problème avec le service. La valeur par défaut est
WIN32_SERVER_ERROR_IGNORE. Le changement de cette valeur n'est pas encore complètement supporté. -
delayed_start -
Si
delayed_startest défini àTRUE, alors il informera le SCM que ce service doit être démarré après les services démarrés automatiquement et un certain délai.N'importe quel service peut être marqué comme étant un service retardé après le démarrage automatique ; cependant, cette configuration n'a aucun effet tant que le paramètre
start_typedu service vautWIN32_SERVICE_AUTO_START.Cette configuration n'est application que sous Windows Vista et les serveurs Windows 2008 et suivants.
-
base_priority -
Pour réduire l'impacte sur l'utilisation du processeur, il peut être nécessaire de définir une priorité plus basse qu'à la normale.
Le paramètre
base_prioritypeut être défini à une des constantes définies dans les classes de basse priorité Win32.
-
-
machine -
Le nom optionnel de la machine sur lequel vous voulez créer le service. Si oublié, cela utilisera la machine locale.
Valeurs de retour
Returns WIN32_NO_ERROR on success, FALSE if there is a problem with the parameters or a Win32 Error Code on failure.
Exemples
Exemple #1 Exemple avec win32_create_service()
Crée un service dont le nom court est 'dummyphp'.
<?php
$x = win32_create_service(array(
'service' => 'dummyphp', # le nom de votre service
'display' => 'service PHP simple PHP', # la description courte
'description' => 'Ceci est un service Windows créé en utilisant PHP', # la description longue
'params' => '"' . __FILE__ . '" run', # chemin vers le script ainsi que les paramètres
));
debug_zval_dump($x);
?>
Voir aussi
- win32_delete_service() - Supprime une entrée de service de la base de données SCM
- Les classes de basse priorité Win32
- Les codes erreurs 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
