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 Configure instance lifecycles.
As regras de faturamento para um hook de ciclo de vida da instância são as mesmas de uma invocação de solicitação regular. 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 desses hooks. Para obter mais informações, consulte Visualize instance lifecycle hook logs.
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 de uma instância de função. Se o hook Initializer falhar na primeira tentativa, a invocação da função falha imediatamente. Na próxima invocação, uma nova instância de função é criada e o hook é executado 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
O hook aceita um único parâmetro de entrada,
context, idêntico ao objetocontextdo handler.Os campos
initializereinitializationTimeoutno objetocontextforam projetados para o hook Initializer. Se você usar o recurso Initializer, esses campos serão definidos com os valores de Initializer Hook e Initializer Hook Timeout Period configurados para a função. Caso contrário, esses campos estarão vazios e serão ignorados.O 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 a seguir 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;
}
?>
Consulte os logs do hook PreStop no Logstore configurado para sua função. Por exemplo, use a seguinte instrução de consulta para encontrar todos os logs da função. Para obter mais informações, consulte Query logs related to hooks.
<funcName> AND <ServiceName> AND qualifier: <VERSION>
Configurar hooks de ciclo de vida
Configurar 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 Configure instance lifecycle. O formato de 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.
Configurar usando Serverless Devs
Se você utilizar o Serverless Devs, adicione as configurações do Initializer Hook e do 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, que contém 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 Common commands of Serverless Devs.
Visualizar os logs dos hooks de ciclo de vida da instância
Visualize os logs do hook 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 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 a conclusão da 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 fornece um projeto de exemplo MySQL que utiliza os hooks Initializer e PreStop. Nesse exemplo, o hook Initializer lê a configuração do banco de dados MySQL das variáveis de ambiente, cria uma conexão MySQL e testa sua conectividade. O hook PreStop encerra a conexão MySQL. Para obter mais informações, consulte php72-mysql.