PHP 8.4.0 RC4 available for testing

win32_start_service_ctrl_dispatcher

(PECL win32service >=0.1.0)

win32_start_service_ctrl_dispatcherRegistra o script no GCS, para que ele possa atuar como o serviço com o nome fornecido

Descrição

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

Quando iniciado através do Gerenciador de Controle de Serviço, um processo de serviço é necessário para "registrar-se" nele para estabelecer monitoramento de serviço e recursos de comunicação. Esta função realiza o registro gerando um thread para lidar com a comunicação de baixo nível com o Gerenciador de Controle de Serviço.

Uma vez iniciado, o processo de serviço deve fazer duas coisas. A primeira é informar o Gerenciador de Controle de Serviço que o serviço está em execução. Isto é conseguido chamando win32_set_service_status() com a constante WIN32_SERVICE_RUNNING. Se for necessário executar algum processo demorado antes que o serviço esteja realmente em execução, pode ser usada a constante WIN32_SERVICE_START_PENDING. A segunda é continuar a fazer registro com o Gerenciador de Controle de Serviço para que ele possa determinar se deve ser encerrado. Isso é conseguido chamando periodicamente a função win32_get_last_control_message() e manipulando o código de retorno de forma adequada.

Cuidado

Desde a versão 0.2.0, esta função funciona somente no SAPI CLI. Em outros SAPI, esta função é desabilitada.

Parâmetros

name

O nome abreviado do serviço, conforme registrado por win32_create_service().

gracefulMode

true para uma saída normal. false para saída com erro. Consulte win32_set_service_exit_mode() para obter mais detalhes.

Valor Retornado

Nenhum valor é retornado.

Antes da versão 1.0.0, retornava WIN32_NO_ERROR em caso de sucesso, false se houver um problema com os parâmetros ou um Código de Erro Win32 em caso de falha.

Erros/Exceções

Antes da versão 1.0.0, se o SAPI não for "cli", esta função emite um erro de nível E_ERROR.

A partir da versão, lança uma exceção Win32ServiceException se o SAPI não for "cli".

Registro de Alterações

Versão Descrição
PECL win32service 1.0.0 Lança uma exceção ValueError em caso de dados inválidos nos parâmetros, anteriormente retornava false.
PECL win32service 1.0.0 Lança uma exceção Win32ServiceException em caso de erro, anteriormente um Código de Erro Win32 era retornado.
PECL win32service 1.0.0 O tipo de retorno agora é void, anteriormente era mixed.
PECL win32service 0.4.0 O parâmetro gracefulMode foi adicionado.
PECL win32service 0.2.0 Esta função funciona apenas no SAPI "cli".

Exemplos

Exemplo #1 Um exemplo de win32_start_service_ctrl_dispatcher()

Verifica se o serviço está sendo executado no GCS.

<?php
if (!win32_start_service_ctrl_dispatcher('dummyphp')) {
die(
"Provavelmente não estou sendo executado no Gerenciador de Controle de Serviço");
}

win32_set_service_status(WIN32_SERVICE_START_PENDING);

// Algum processo demorado para colocar este serviço em funcionamento.

win32_set_service_status(WIN32_SERVICE_RUNNING);

while (
WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
# faça algum trabalho aqui, tentando não demorar mais do que cerca de 30 segundos
# antes de voltar ao loop novamente
}
?>

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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