Este tópico descreve como implementar e usar hooks de ciclo de vida da instância em um runtime PHP.
Contexto
Ao implementar e configurar um hook de ciclo de vida da instância, o Function Compute invoca o hook correspondente quando ocorre um evento específico do ciclo de vida. O runtime PHP oferece suporte a dois hooks de ciclo de vida da instância: Initializer e PreStop. Para obter mais informações, consulte Configurar ciclos de vida da instância.
As regras de faturamento para um hook de ciclo de vida da instância são as mesmas aplicadas a uma invocação de solicitação comum. No entanto, você pode consultar os logs de execução apenas em Real-time Logs, Function Logs ou Advanced Logs. A invocation request list não exibe logs para esses hooks. Para mais detalhes, consulte Visualizar logs de hooks de ciclo de vida da instância.
Hook Initializer
Exemplo de Initializer
O hook Initializer é executado após o início de uma instância de função, mas antes da execução do handler. O Function Compute garante que o hook Initializer seja executado com sucesso no máximo uma vez durante o ciclo de vida da instância da função. Se o hook Initializer falhar na primeira tentativa, a invocação da função falha imediatamente. Na próxima invocação, o sistema cria uma nova instância de função e executa o hook novamente.
Quando um hook Initializer atinge o tempo limite ou falha, o servidor sempre retorna um código de status HTTP 200. Verifique o cabeçalho de resposta X-Fc-Error-Type:InitializationError ou o campo errorMessage no corpo da resposta para determinar se o erro foi causado por uma falha de inicialização.
O hook Initializer aceita um único parâmetro de entrada, $context, idêntico ao parâmetro de contexto em um handler.
A seguir, apresentamos um hook Initializer mínimo.
<?php
function my_initializer($context) {
$logger = $GLOBALS['fcLogger'];
$logger->info("hello world");
}
?>
my_initializer é o nome do método do hook Initializer. Esse nome deve corresponder ao valor definido para o Initializer Hook no console do Function Compute. Por exemplo, se você configurar o Initializer Hook como main.my_initializer para sua função, o Function Compute carregará e executará o método my_initializer definido no arquivo main.php.
Assinatura do método
Este hook aceita um único parâmetro de entrada,
context, idêntico ao objetocontextdo handler.Os campos
initializereinitializationTimeoutno objetocontextforam projetados para o hook Initializer. Caso utilize o recurso Initializer, esses campos assumem os valores configurados em Initializer Hook e Initializer Hook Timeout Period para a função. Caso contrário, permanecem vazios e são ignorados.Este hook não possui valor de retorno.
Hook PreStop
O hook PreStop é executado antes da destruição de uma instância de função. Ele possui a mesma assinatura de método que o hook Initializer.
Veja abaixo um exemplo de hook PreStop.
<?php
$counter = 0;
function preStop($context) {
$GLOBALS['fcLogger']->info("preStop ok");
}
function handler($event, $context) {
global $counter;
$counter += 2;
return $counter;
}
?>
Você pode consultar os logs do hook PreStop no Logstore configurado para sua função. Utilize, por exemplo, a seguinte instrução de consulta para localizar todos os logs da função. Para mais informações, consulte Consultar logs relacionados a hooks.
<funcName> AND <ServiceName> AND qualifier: <VERSION>
Configurar hooks de ciclo de vida
Configuração no console
No console do Function Compute, configure o Initializer Hook e o PreStop Hook para uma função FC na seção . Para obter mais informações, consulte Configurar ciclo de vida da instância. O formato do callback é [file_name.method_name]. Exemplo:
Defina Initializer Hook como
index.initializepara chamar o métodoinitializeno arquivoindex.php.Defina PreStop Hook como
index.preStoppara chamar o métodopreStopno arquivoindex.php.
Configuração via Serverless Devs
Caso utilize o Serverless Devs, adicione as configurações de Initializer Hook e PreStop Hook ao seu arquivo s.yaml.
-
Configuração do hook Initializer
Na configuração da function, adicione o campo instanceLifecycleConfig.initializer, que inclui os campos handler e timeout.
-
Configuração do hook PreStop
Adicione o campo instanceLifecycleConfig.preStop, contendo os campos handler e timeout, à configuração da function.
O código a seguir fornece um exemplo de configuração.
edition: 3.0.0
name: fcDeployApp
access: "default"
vars: # Global variables
region: "cn-hangzhou"
resources:
hello_world:
component: fc3 # Component name
props:
region: ${vars.region} # For more information about how to use variables, see: https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC
functionName: "testphp"
description: 'this is a test'
runtime: "php7.2"
code: ./
handler: index.handler
memorySize: 128
timeout: 30
instanceLifecycleConfig: # Instance lifecycle hooks
initializer: # Initializer hook
handler: index.my_initializer
timeout: 60
preStop: # PreStop hook
handler: index.preStop # Function handler
timeout: 60 # Timeout
Para obter mais informações sobre as especificações de configuração YAML para Serverless Devs, consulte Comandos comuns do Serverless Devs.
Visualizar logs de hooks de ciclo de vida da instância
Visualize os logs dos hooks de ciclo de vida em Logs.
Faça login no console do Function Compute. No painel de navegação à esquerda, escolha .
Na barra de navegação superior, selecione uma região. Na página Functions, clique em a função desejada.
-
Na página de detalhes da função, clique em a aba Test Function, clique em Test Function e, em seguida, escolha .
Na aba Logs, visualize os logs de invocação da função e os logs do Initializer. Exemplo:
2024-03-04 17:57:28FC Initialize Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69 2024-03-04 17:57:282024-03-04 09:57:28.192 1-65e59b07-1520da26-bf73bbb91b69 [info] initializer 2024-03-04 17:57:28FC Initialize End RequestId: 1-65e59b07-1520da26-bf73bbb91b69 2024-03-04 17:57:28FC Invoke Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69 2024-03-04 17:57:28FC Invoke End RequestId: 1-65e59b07-1520da26-bf73bbb91b69Como cada instância de função permanece em cache por um período e não é destruída imediatamente, não é possível visualizar os logs dos hooks PreStop instantaneamente. Para acionar rapidamente um hook PreStop, atualize as configurações ou o código da função. Após concluir a atualização, visualize os logs dos hooks PreStop em Function Logs. O código de amostra a seguir mostra um exemplo:
2024-03-04 18:33:26FC PreStop Start RequestId: 93c93603-9fbe-4576-9458-193c8b213031 2024-03-04 18:33:262024-03-04 10:33:26.077 93c93603-9fbe-4576-9458-193c8b213031 [info] preStop 2024-03-04 18:33:26FC PreStop End RequestId: 93c93603-9fbe-4576-9458-193c8b213031
Programa de exemplo
O Function Compute disponibiliza um projeto de exemplo MySQL que utiliza os hooks Initializer e PreStop. Neste exemplo, o hook Initializer lê a configuração do banco de dados MySQL a partir de variáveis de ambiente, cria uma conexão MySQL e testa sua conectividade. Já o hook PreStop encerra a conexão MySQL. Para mais informações, consulte php72-mysql.