本文介紹PHP如何實現(xiàn)并應用函數(shù)實例生命周期回調方法。
背景信息
當您實現(xiàn)并配置函數(shù)實例生命周期回調后,函數(shù)計算將在相關實例生命周期事件發(fā)生時調用對應的回調程序。當前PHP運行時支持Initializer和PreStop兩種函數(shù)實例生命周期回調函數(shù)。更多信息,請參見配置實例生命周期。
函數(shù)實例生命周期回調程序與正常調用請求計費規(guī)則一致,但其執(zhí)行日志只能在函數(shù)日志、實時日志或高級日志中查詢,調用請求列表不會展示回調程序日志。具體操作,請參見查看實例生命周期回調函數(shù)日志。
Initializer回調
Initializer示例
初始化回調程序(Initializer回調)在函數(shù)實例啟動成功之后,運行請求處理程序(Handler)之前執(zhí)行。函數(shù)計算保證在一個實例生命周期內,成功且最多成功執(zhí)行一次Initializer回調。例如,您的Initializer回調第一次執(zhí)行失敗后系統(tǒng)會重試,直到成功為止,然后再執(zhí)行您的請求處理程序。因此,您在實現(xiàn)Initializer回調時,需要保證其被重復調用時的正確性。
Initializer回調只有一個$context輸入?yún)?shù),使用方法和事件請求處理程序一樣。
一個最簡單的Initializer回調如下所示。
<?php
function my_initializer($context) {
$logger = $GLOBALS['fcLogger'];
$logger->info("hello world");
}
?>
my_initializer
是Initializer回調方法名,需要與您在函數(shù)計算控制臺配置的Initializer 回調程序相對應。例如,您為函數(shù)配置的Initializer 回調程序為main.my_initializer
,那么函數(shù)計算在配置Initializer屬性后會去加載main.php
中定義的my_initializer
方法。
方法簽名
輸入?yún)?shù)只有
context
,包含的信息和事件請求處理程序(handler)的context
保持一致。context
中initializer
和initializationTimeout
兩個信息是為Initializer回調設計,如果使用Initializer功能,會被分別設置為您為函數(shù)配置的Initializer 回調程序和Initializer 回調超時時間的值,否則為空,且不生效。無返回值。
PreStop回調
預停止回調程序(PreStop回調)在函數(shù)實例銷毀前執(zhí)行,方法簽名同Initializer回調。
如下是preStop回調的具體示例。
<?php
$counter = 0;
function preStop($context) {
$GLOBALS['fcLogger']->info("preStop ok");
}
function handler($event, $context) {
global $counter;
$counter += 2;
return $counter;
}
?>
您可以在您為函數(shù)開通的LogStore中查詢到PreStop函數(shù)的日志。比如使用如下格式的語句查詢該函數(shù)所有日志。更多信息,請參見查詢回調函數(shù)相關日志。
<funcName> AND <ServiceName> AND qualifier: <VERSION>
配置生命周期回調函數(shù)
通過控制臺配置
您可以在函數(shù)計算控制臺的FC函數(shù)配置中,配置Initializer 回調程序和PreStop 回調程序。具體操作步驟,請參見配置實例生命周期?;卣{格式為[文件名.方法名]
,例如:
Initializer 回調程序設置為
index.initialize
,表示index.php
文件中的initialize
方法。PreStop 回調程序設置為
index.preStop
,表示index.php
文件中的preStop
方法。
通過Serverless Devs工具配置
如果使用Serverless Devs工具,需要在s.yaml
配置文件中添加Initializer 回調程序和PreStop 回調程序。
Initializer回調配置
在function配置下添加instanceLifecycleConfig.initializer字段,包括handler和timeout兩個字段。
PreStop回調配置
在function配置下添加instanceLifecycleConfig.preStop字段,包括handler和timeout兩個字段。
具體的示例如下所示。
edition: 3.0.0
name: fcDeployApp
access: "default"
vars: # 全局變量
region: "cn-hangzhou"
resources:
hello_world:
component: fc3 # 組件名稱
props:
region: ${vars.region} # 關于變量的使用方法,可以參考: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: # 擴展函數(shù)
initializer: # initializer函數(shù)
handler: index.my_initializer
timeout: 60
preStop: # PreStop函數(shù)
handler: index.preStop # 函數(shù)入口
timeout: 60 # 超時時間
關于Serverless Devs的YAML配置規(guī)范,請參見Serverless Devs常用命令。
查看實例生命周期回調函數(shù)日志
您可以通過函數(shù)日志功能查看回調函數(shù)日志。
登錄函數(shù)計算控制臺,在左側導航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊目標函數(shù)。
在函數(shù)詳情頁面,選擇測試頁簽,單擊測試函數(shù),然后選擇 。
在函數(shù)日志頁簽,您可以查看函數(shù)的調用日志和Initializer回調日志,示例如下。
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-bf73bbb91b69
因為每個函數(shù)實例會緩存一段時間,不會馬上銷毀,因此不能立即查看PreStop回調日志。如需快速觸發(fā)PreStop回調,可更新函數(shù)配置或者函數(shù)代碼。更新完成后,再次查看函數(shù)日志,您可以查看PreStop回調日志。示例如下。
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
示例程序
函數(shù)計算為您提供了使用Initializer回調和PreStop回調的MySQL示例程序。在本示例中,Initializer回調函數(shù)用于從環(huán)境變量中獲取MySQL數(shù)據(jù)庫配置,創(chuàng)建MySQL連接并測試連通性,PreStop回調函數(shù)負責關閉MySQL連接。詳細信息,請參見php72-mysql。