PHP 8.4.1 Released!

win32_create_service

(PECL win32service >=0.1.0)

win32_create_serviceCria uma nova entrada de serviço no banco de dados do GCS

Descrição

win32_create_service(array $details, string $machine = null): void

Tentativas de adicionar um serviço ao banco de dados do GCS. Privilégios de administrador são necessários para que isso seja bem-sucedido.

Parâmetros

details

Um array de detalhes do serviço:

service

O nome abreviado do serviço. Este é o nome que será usado para controlar o serviço usando o comando net. O serviço deve ser único (dois serviços não podem compartilhar o mesmo nome) e, idealmente, espaços devem ser evitados no nome.

display

O nome de exibição do serviço. Este é o nome que será exibido no aplicativo de serviços.

description

A longa descrição do serviço. Esta é a descrição que será exibida no aplicativo de serviços.

user

O nome da conta de usuário sob a qual o serviço será executado. Se omitido, o serviço será executado como a conta LocalSystem. Se o nome de usuário for especificado, também deverá ser fornecida uma senha.

password

A senha que corresponde ao user.

path

O caminho completo para o módulo executável que será iniciado quando o serviço for iniciado. Se omitido, será usado o caminho para o processo PHP atual.

params

Parâmetros de linha de comando a serem passados ​​ao serviço quando ele for iniciado. Se a intenção for executar um script PHP como serviço, o primeiro parâmetro deve ser o caminho completo para o script PHP que será executado. Se o nome ou caminho do script contiver espaços, o caminho completo para o script PHP deve ser envolvido com ".

load_order

Controla a ordem de carregamento. Isso ainda não é totalmente suportado.

svc_type

Define o tipo de serviço. Se omitido, o valor padrão será WIN32_SERVICE_WIN32_OWN_PROCESS. Isto não deve ser alterado a não ser que se saiba o que está sendo feito.

start_type

Especifica como o serviço deve ser iniciado. O padrão é WIN32_SERVICE_AUTO_START o que significa que o serviço será iniciado quando a máquina for inicializada.

error_control

Informa ao GCS o que deve fazer ao detectar algum problema no serviço. O padrão é WIN32_SERVER_ERROR_IGNORE. A alteração deste valor ainda não é totalmente suportada.

delayed_start

Se delayed_start estiver definido como true, isso informará ao GCS que este serviço deve ser iniciado após outros serviços de inicialização automática serem iniciados, além de um pequeno atraso.

Qualquer serviço pode ser marcado como serviço de inicialização automática atrasada; entretanto, essa configuração não terá efeito a menos que o start_type do serviço seja WIN32_SERVICE_AUTO_START.

Essa configuração só é aplicável no Windows Vista e no Windows Server 2008 ou superior.

base_priority

Para reduzir o impacto na utilização do processador, poderá ser necessário definir uma prioridade base inferior à normal.

O parâmetro base_priority pode ser definido como uma das constantes definidas em Classes de prioridade básica Win32.

dependencies

Para definir as dependências de um serviço, pode ser necessário definir este parâmetro para a lista de nomes de serviços em um array.

recovery_delay

Este parâmetro define o atraso entre a falha e a execução da ação de recuperação. O valor está em milissegundos.

O valor padrão é 60000.

recovery_action_1

A ação será executada na primeira falha. O valor padrão é WIN32_SC_ACTION_NONE.

O parâmetro recovery_action_1 pode ser definido como uma das constantes definidas em Ação de recuperação do Win32.

recovery_action_2

A ação será executada na segunda falha. O valor padrão é WIN32_SC_ACTION_NONE.

O parâmetro recovery_action_2 pode ser definido como uma das constantes definidas em Ação de recuperação do Win32.

recovery_action_3

A ação será executada nas falhas seguintes. O valor padrão é WIN32_SC_ACTION_NONE.

O parâmetro recovery_action_3 pode ser definido como uma das constantes definidas em Ação de recuperação do Win32.

recovery_reset_period

A contagem de falhas será zerada após o atraso definido no parâmetro. O atraso é em segundos.

O valor padrão é 86400.

recovery_enabled

Defina este parâmetro como true para ativar as configurações de recuperação, false para desativar.

O valor padrão é false.

recovery_reboot_msg

Defina este parâmetro para definir a mensagem gravada no registro de eventos do Windows antes da reinicialização. Usado somente se uma ação estiver definida como WIN32_SC_ACTION_REBOOT.

recovery_command

Defina este parâmetro para definir o comando executado quando uma ação é definida em WIN32_SC_ACTION_RUN_COMMAND.

machine

O nome da máquina opcional na qual o serviço será criado. Se omitido, usará a máquina local.

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

Uma exceção ValueError é lançada se o valor do parâmetro service estiver vazio.

Uma exceção ValueError é lançada se o valor do parâmetro path estiver faltando ou se estiver vazio.

Uma exceção ValueError é lançada se o valor do parâmetro svc_type estiver errado.

Uma exceção ValueError é lançada se o valor do parâmetro start_type estiver errado.

Uma exceção ValueError é lançada se o valor do parâmetro error_control estiver errado.

Uma exceção ValueError é lançada se o valor do parâmetro base_priority estiver errado.

Uma exceção ValueError é lançada se o valor do parâmetro recovery_delay não estiver entre 0 e PHP_INT_MAX.

Uma exceção ValueError é lançada se o valor do parâmetro recovery_action_1 estiver errado.

Uma exceção ValueError é lançada se o valor do parâmetro recovery_action_2 estiver errado.

Uma exceção ValueError é lançada se o valor do parâmetro recovery_action_3 estiver errado.

Uma exceção ValueError é lançada se o valor do parâmetro recovery_reset_period não estiver entre 0 e PHP_INT_MAX.

Uma exceção Win32ServiceException é lançada em caso de erro.

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 Os parâmetros dependencies, recovery_delay, recovery_action_1, recovery_action_2, recovery_action_3, recovery_reset_period, recovery_enabled, recovery_reboot_msg e recovery_command foram adicionados.

Exemplos

Exemplo #1 Um exemplo de win32_create_service()

Cria um serviço com o nome abreviado 'dummyphp'.

<?php
$x
= win32_create_service(array(
'service' => 'dummyphp', // o nome do serviço
'display' => 'serviço de exemplo do PHP', // breve descrição
'description' => 'Este é um serviço do Windows criado com o PHP.', // descrição longa
'params' => '"' . __FILE__ . '" executar', // caminho para o script e parâmetros
));
debug_zval_dump($x);
?>

Exemplo #2 Um exemplo de win32_create_service() com dependências

Cria um serviço com o nome abreviado 'dummyphp' e dependências.

<?php
$x
= win32_create_service(array(
'service' => 'dummyphp', // o nome do serviço
'display' => 'serviço de exemplo do PHP', // breve descrição
'description' => 'Este é um serviço do Windows criado com o PHP.', // descrição longa
'params' => '"' . __FILE__ . '" executar', // caminho para o script e parâmetros
'dependencies' => array("Netman"), // A lista das dependências
));
debug_zval_dump($x);
?>

Exemplo #3 Um exemplo de win32_create_service() com recuperação

Cria um serviço com o nome abreviado 'dummyphp' e configurações de recuperação.

<?php
$x
= win32_create_service(array(
'service' => 'dummyphp', // o nome do serviço
'display' => 'serviço de exemplo do PHP', // breve descrição
'description' => 'Este é um serviço do Windows criado com o PHP.', // descrição longa
'params' => '"' . __FILE__ . '" executar', // caminho para o script e parâmetros
'recovery_delay' => 120000, // A ação de recuperação é executada após 2 minutos
'recovery_action_1' => WIN32_SC_ACTION_RESTART, // Na primeira falha, reinicia o serviço
'recovery_action_2' => WIN32_SC_ACTION_RUN_COMMAND, // Na segunda falha, executa o comando
'recovery_action_3' => WIN32_SC_ACTION_NONE, // Em caso de outra falha, não faz nada
'recovery_reset_period' => 86400, // Redefine o contador de falhas após 1 dia
'recovery_enabled' => true, // Habilita o parâmetro de recuperação
'recovery_reboot_msg' => null, // Não define uma mensagem de reinicialização, não é necessária aqui
'recovery_command' => "c:\limpa-serviço.bat", // Quando a ação é WIN32_SC_ACTION_RUN_COMMAND, executa este comando
));
debug_zval_dump($x);
?>

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
2
pauljamesthomson at gmail dot com
17 years ago
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
up
0
Anonymous
14 years ago
[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();
?>
To Top