Cette rubrique explique comment implémenter et utiliser les hooks de cycle de vie des instances dans un environnement d'exécution PHP.
Contexte
Lorsque vous implémentez et configurez un hook de cycle de vie d'instance, Function Compute invoque le hook correspondant lors d'un événement de cycle de vie spécifique. L'environnement d'exécution PHP prend en charge deux hooks de cycle de vie d'instance : Initializer et PreStop. Pour plus d'informations, consultez la rubrique Configurer les cycles de vie des instances.
Les règles de facturation d'un hook de cycle de vie d'instance sont identiques à celles d'une invocation de requête standard. Toutefois, vous ne pouvez consulter ses journaux d'exécution que dans les sections Real-time Logs, Function Logs ou Advanced Logs. La liste invocation request list n'affiche pas les journaux relatifs à ces hooks. Pour plus d'informations, consultez la section Afficher les journaux des hooks de cycle de vie des instances.
Hook Initializer
Exemple de hook Initializer
Le hook Initializer s'exécute après le démarrage d'une instance de fonction, mais avant l'exécution de son gestionnaire (handler). Function Compute garantit l'exécution réussie du hook Initializer au plus une fois au cours du cycle de vie d'une instance de fonction. Si le hook Initializer échoue lors de sa première tentative, l'invocation de la fonction échoue immédiatement. Lors de l'invocation suivante, une nouvelle instance de fonction est créée et le hook s'exécute à nouveau.
En cas d'expiration du délai ou d'échec d'un hook Initializer, le serveur renvoie toujours un code d'état HTTP 200. Vérifiez l'en-tête de réponse X-Fc-Error-Type:InitializationError ou le champ errorMessage dans le corps de la réponse pour déterminer si l'erreur provient d'un échec d'initialisation.
Le hook Initializer accepte un seul paramètre d'entrée, $context, identique au paramètre de contexte d'un gestionnaire.
Voici un exemple minimal de hook Initializer.
<?php
function my_initializer($context) {
$logger = $GLOBALS['fcLogger'];
$logger->info("hello world");
}
?>
my_initializer correspond au nom de la méthode du hook Initializer. Ce nom doit correspondre à la valeur définie pour le champ Initializer Hook dans la console Function Compute. Par exemple, si vous configurez le champ Initializer Hook avec la valeur main.my_initializer pour votre fonction, Function Compute charge et exécute la méthode my_initializer définie dans le fichier main.php.
Signature de la méthode
Le hook accepte un seul paramètre d'entrée,
context, identique à l'objetcontextdu gestionnaire.Les champs
initializeretinitializationTimeoutde l'objetcontextsont conçus spécifiquement pour le hook Initializer. Si vous utilisez la fonctionnalité Initializer, ces champs prennent les valeurs configurées pour les paramètres Initializer Hook et Initializer Hook Timeout Period de la fonction. Dans le cas contraire, ces champs restent vides et sont ignorés.Le hook ne renvoie aucune valeur.
Hook PreStop
Le hook PreStop s'exécute avant la destruction d'une instance de fonction. Sa signature de méthode est identique à celle du hook Initializer.
Voici un exemple de hook PreStop.
<?php
$counter = 0;
function preStop($context) {
$GLOBALS['fcLogger']->info("preStop ok");
}
function handler($event, $context) {
global $counter;
$counter += 2;
return $counter;
}
?>
Consultez les journaux du hook PreStop dans le Logstore configuré pour votre fonction. Par exemple, utilisez l'instruction de requête suivante pour retrouver tous les journaux associés à la fonction. Pour plus d'informations, consultez la section Interroger les journaux liés aux hooks.
<funcName> AND <ServiceName> AND qualifier: <VERSION>
Configurer les hooks de cycle de vie
Configuration via la console
Dans la console Function Compute, configurez les paramètres Initializer Hook et PreStop Hook d'une fonction FC dans la section . Pour plus d'informations, consultez la rubrique Configurer le cycle de vie des instances. Le format de rappel est [file_name.method_name], par exemple :
Définissez le paramètre Initializer Hook sur
index.initializepour appeler la méthodeinitializedu fichierindex.php.Définissez le paramètre PreStop Hook sur
index.preStoppour appeler la méthodepreStopdu fichierindex.php.
Configuration à l'aide de Serverless Devs
Si vous utilisez Serverless Devs, ajoutez les configurations des paramètres Initializer Hook et PreStop Hook à votre fichier s.yaml.
-
Configuration du hook Initializer
Dans la configuration de la fonction (champ function), ajoutez le champ instanceLifecycleConfig.initializer, qui comprend les sous-champs handler et timeout.
-
Configuration du hook PreStop
Ajoutez le champ instanceLifecycleConfig.preStop à la configuration de la fonction (champ function). Ce champ contient les sous-champs handler et timeout.
Le code suivant fournit un exemple de configuration.
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
Pour plus d'informations sur les spécifications de configuration YAML pour Serverless Devs, consultez la rubrique Commandes courantes de Serverless Devs.
Afficher les journaux des hooks de cycle de vie des instances
Affichez les journaux des hooks de cycle de vie dans la section Logs.
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
-
Sur la page des détails de la fonction, cliquez sur l'onglet Test Function, puis cliquez sur Test Function et choisissez .
Dans l'onglet Logs, consultez les journaux d'invocation de fonction ainsi que les journaux Initializer. Exemple :
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-bf73bbb91b69Chaque instance de fonction étant mise en cache pendant une certaine période et non détruite immédiatement, vous ne pouvez pas consulter les journaux des hooks PreStop instantanément. Pour déclencher rapidement un hook PreStop, mettez à jour la configuration ou le code de la fonction. Une fois la mise à jour terminée, affichez les journaux des hooks PreStop dans la section Function Logs. L'exemple de code suivant illustre ce processus :
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
Exemple de programme
Function Compute propose un exemple de projet MySQL utilisant les hooks Initializer et PreStop. Dans cet exemple, le hook Initializer lit la configuration de la base de données MySQL à partir des variables d'environnement, établit une connexion MySQL et teste sa connectivité. Le hook PreStop ferme la connexion MySQL. Pour plus d'informations, consultez le dépôt php72-mysql.