Topik ini menjelaskan cara mengimplementasikan dan menggunakan instance lifecycle hooks dalam runtime PHP.
Latar Belakang
Saat Anda mengimplementasikan dan mengonfigurasi instance lifecycle hook, Function Compute memanggil hook yang sesuai ketika event siklus hidup tertentu terjadi. Runtime PHP mendukung dua instance lifecycle hooks: Initializer dan PreStop. Untuk informasi lebih lanjut, lihat Konfigurasikan instance lifecycles.
Aturan penagihan untuk instance lifecycle hook sama dengan aturan untuk pemanggilan permintaan biasa. Namun, log eksekusinya hanya dapat dikueri di Real-time Logs, Function Logs, atau Advanced Logs. Daftar invocation request list tidak menampilkan log untuk hook-hook ini. Untuk informasi lebih lanjut, lihat Lihat log instance lifecycle hook.
Hook Initializer
Contoh Initializer
Hook Initializer dijalankan setelah instans fungsi dimulai tetapi sebelum penanganannya dieksekusi. Function Compute memastikan bahwa hook Initializer berhasil dieksekusi paling banyak satu kali dalam siklus hidup instans fungsi. Jika hook Initializer gagal pada percobaan pertama, pemanggilan fungsi langsung gagal. Pada pemanggilan berikutnya, instans fungsi baru dibuat dan hook dijalankan kembali.
Ketika hook Initializer mengalami timeout atau gagal, server selalu mengembalikan kode status HTTP 200. Anda harus memeriksa header respons X-Fc-Error-Type:InitializationError atau bidang errorMessage dalam badan respons untuk menentukan apakah kesalahan disebabkan oleh kegagalan inisialisasi.
Hook Initializer menerima satu parameter input, $context, yang identik dengan parameter konteks dalam handler.
Berikut adalah contoh minimal hook Initializer.
<?php
function my_initializer($context) {
$logger = $GLOBALS['fcLogger'];
$logger->info("hello world");
}
?> my_initializer adalah nama metode hook Initializer. Nama ini harus sesuai dengan nilai yang Anda atur untuk Initializer Hook di Konsol Function Compute. Misalnya, jika Anda mengonfigurasi Initializer Hook sebagai main.my_initializer untuk fungsi Anda, Function Compute memuat dan menjalankan metode my_initializer yang didefinisikan dalam file main.php.
Signature metode
Hook menerima satu parameter input,
context, yang identik dengan objekcontextpada handler.Bidang
initializerdaninitializationTimeoutdalam objekcontextdirancang khusus untuk hook Initializer. Jika Anda menggunakan fitur Initializer, bidang-bidang ini diatur ke nilai Initializer Hook dan Initializer Hook Timeout Period yang Anda konfigurasi untuk fungsi tersebut. Jika tidak, bidang-bidang ini kosong dan diabaikan.Hook tidak memiliki nilai kembali.
Hook PreStop
Hook PreStop dijalankan sebelum instans fungsi dihapus. Hook ini memiliki signature metode yang sama dengan hook Initializer.
Berikut adalah contoh hook PreStop.
<?php
$counter = 0;
function preStop($context) {
$GLOBALS['fcLogger']->info("preStop ok");
}
function handler($event, $context) {
global $counter;
$counter += 2;
return $counter;
}
?>Anda dapat mengkueri log untuk hook PreStop di Logstore yang dikonfigurasi untuk fungsi Anda. Misalnya, gunakan pernyataan kueri berikut untuk menemukan semua log untuk fungsi tersebut. Untuk informasi lebih lanjut, lihat Kueri log terkait hook.
<funcName> AND <ServiceName> AND qualifier: <VERSION>Konfigurasi lifecycle hooks
Konfigurasi di konsol
Di Konsol Function Compute, Anda dapat mengonfigurasi Initializer Hook dan PreStop Hook untuk fungsi FC di bagian . Untuk informasi lebih lanjut, lihat Konfigurasikan instance lifecycle. Format callback-nya adalah [file_name.method_name], misalnya:
Atur Initializer Hook ke
index.initializeuntuk memanggil metodeinitializedalam fileindex.php.Atur PreStop Hook ke
index.preStopuntuk memanggil metodepreStopdalam fileindex.php.
Konfigurasi menggunakan Serverless Devs
Jika Anda menggunakan Serverless Devs, tambahkan konfigurasi untuk Initializer Hook dan PreStop Hook ke file s.yaml Anda.
Konfigurasi hook Initializer
Dalam konfigurasi function, tambahkan bidang instanceLifecycleConfig.initializer, yang mencakup bidang handler dan timeout.
Konfigurasi hook PreStop
Tambahkan bidang instanceLifecycleConfig.preStop, yang berisi bidang handler dan timeout, ke konfigurasi function.
Kode berikut memberikan contoh konfigurasi.
edition: 3.0.0
name: fcDeployApp
access: "default"
vars: # Variabel global
region: "cn-hangzhou"
resources:
hello_world:
component: fc3 # Nama komponen
props:
region: ${vars.region} # Untuk informasi lebih lanjut tentang cara menggunakan variabel, lihat: 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
Untuk informasi lebih lanjut tentang spesifikasi konfigurasi YAML untuk Serverless Devs, lihat Perintah umum Serverless Devs.
Lihat log instance lifecycle hooks
Anda dapat melihat log untuk lifecycle hook di Logs.
Masuk ke Konsol Function Compute. Di panel navigasi kiri, pilih .
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang dituju.
Di halaman detail fungsi, klik tab Test Function, klik Test Function, lalu pilih .
Di tab Logs, Anda dapat melihat log pemanggilan fungsi dan log Initializer. Contoh:
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-bf73bbb91b69Setiap instans fungsi di-cache selama periode tertentu dan tidak langsung dihapus, sehingga Anda tidak dapat langsung melihat log untuk hook PreStop. Untuk memicu hook PreStop dengan cepat, Anda dapat memperbarui konfigurasi fungsi atau kode fungsi. Setelah pembaruan selesai, Anda dapat melihat log untuk hook PreStop di Function Logs. Kode contoh berikut menunjukkan contohnya:
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
Program contoh
Function Compute menyediakan proyek contoh MySQL yang menggunakan hook Initializer dan PreStop. Dalam contoh ini, hook Initializer membaca konfigurasi database MySQL dari variabel lingkungan, membuat koneksi MySQL, dan menguji konektivitasnya. Hook PreStop menutup koneksi MySQL tersebut. Untuk informasi lebih lanjut, lihat php72-mysql.