本文介紹PHP事件請(qǐng)求處理程序的結(jié)構(gòu)和使用示例。
Event Handler簽名
一個(gè)簡(jiǎn)單的Event Handler簽名定義如下。
<?php
function handler($event, $context) {
return 'hello world';
}
Event Handler的示例解析如下:
handler
:方法名稱(chēng)。與函數(shù)計(jì)算控制臺(tái)配置的請(qǐng)求處理程序相對(duì)應(yīng)。例如,為FC函數(shù)配置的請(qǐng)求處理程序為index.handler
,那么函數(shù)計(jì)算會(huì)去加載index.php
中定義的handler
函數(shù),并從handler
函數(shù)開(kāi)始執(zhí)行。$event
:您調(diào)用函數(shù)時(shí)傳入的參數(shù),其數(shù)據(jù)類(lèi)型是字符串。PHP函數(shù)直接使用您指定的event
參數(shù),不會(huì)做任何預(yù)處理,您在函數(shù)中可以根據(jù)實(shí)際情況解析event
。例如,輸入數(shù)據(jù)是JSON字符串,您可以把輸入的數(shù)據(jù)轉(zhuǎn)換為Array。$context
:包含函數(shù)的運(yùn)行時(shí)信息,例如請(qǐng)求ID和臨時(shí)身份驗(yàn)證,便于您在代碼中使用這些信息。
示例一:解析JSON格式參數(shù)
示例代碼
當(dāng)您傳入JSON格式參數(shù)時(shí),函數(shù)計(jì)算會(huì)透?jìng)鲄?shù)內(nèi)容,需要您在代碼中自行解析。下面是解析JSON格式事件的代碼示例。
<?php
function handler($event, $context) {
$v = json_decode($event, true);
var_dump($v['key1']);
var_dump($v['key2']);
var_dump($v['key3']);
return $v;
}
前提條件
創(chuàng)建運(yùn)行環(huán)境為PHP的函數(shù)。具體操作,請(qǐng)參見(jiàn)創(chuàng)建函數(shù)。
操作步驟
- 登錄函數(shù)計(jì)算控制臺(tái),在左側(cè)導(dǎo)航欄,單擊服務(wù)及函數(shù)。
- 在頂部菜單欄,選擇地域,然后在服務(wù)列表頁(yè)面,單擊目標(biāo)服務(wù)。
- 在函數(shù)管理頁(yè)面,單擊目標(biāo)函數(shù)名稱(chēng)。
- 在函數(shù)詳情頁(yè)面,單擊函數(shù)代碼頁(yè)簽,在代碼編輯器中輸入上述示例代碼,然后單擊部署代碼。說(shuō)明 上述示例代碼中函數(shù)的請(qǐng)求處理程序是
index.php
中的handler
方法。如果您的函數(shù)配置的請(qǐng)求處理程序不同,請(qǐng)?zhí)鎿Q為實(shí)際的文件和方法。 - 在函數(shù)代碼頁(yè)簽,單擊測(cè)試函數(shù)右側(cè)的圖標(biāo),從下拉列表中選擇配置測(cè)試參數(shù),輸入如下示例測(cè)試參數(shù),然后單擊確定。
{ "key1": "value1", "key2": "value2", "key3": { "v1": true, "v2": "bye", "v3": 1234 } }
- 單擊測(cè)試函數(shù)。執(zhí)行成功后,您從返回結(jié)果中可以看到函數(shù)成功返回了上面的JSON格式,并且日志輸出里打印了
key1
,key2
和key3
的內(nèi)容。
示例二:通過(guò)臨時(shí)密鑰安全讀寫(xiě)OSS的資源
示例代碼
您可以使用函數(shù)計(jì)算為您提供的臨時(shí)密鑰訪問(wèn)對(duì)象存儲(chǔ)OSS,代碼示例如下所示。
<?php
use OSS\OssClient;
use OSS\Core\OssException;
function handler($event, $context) {
/*
阿里云賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,建議您使用RAM用戶(hù)進(jìn)行API訪問(wèn)或日常運(yùn)維。
建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
本示例以從上下文中獲取AccessKey/AccessSecretKey為例。
*/
$creds = $context["credentials"];
$accessKeyId = $creds["accessKeyId"];
$accessKeySecret = $creds["accessKeySecret"];
$securityToken = $creds["securityToken"];
$endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com";
$bucket= "randombucket";
$object = "exampledir/index.php";
$filePath = "/code/index.php";
try{
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
$ossClient->uploadFile($bucket, $object, $filePath);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return $e->getMessage();
}
return 'hello world';
}
示例代碼解析如下:
$creds = $context["credentials"]
:表示從$context
參數(shù)中獲取臨時(shí)密鑰,避免在代碼中硬編碼密碼等敏感信息。- 以上代碼表示將
/code/index.php
文件上傳到OSS的randombucket
的exampledir目錄下。說(shuō)明 請(qǐng)根據(jù)實(shí)際情況,將endpoint
、bucket
、object
和filePath
替換為真實(shí)的資源名稱(chēng)。
前提條件
- 為服務(wù)配置具有訪問(wèn)對(duì)象存儲(chǔ)OSS的權(quán)限的角色。具體操作,請(qǐng)參見(jiàn)授予函數(shù)計(jì)算訪問(wèn)其他云服務(wù)的權(quán)限。
- 創(chuàng)建運(yùn)行環(huán)境為PHP的函數(shù)。具體操作,請(qǐng)參見(jiàn)創(chuàng)建函數(shù)。
操作步驟
- 登錄函數(shù)計(jì)算控制臺(tái),在左側(cè)導(dǎo)航欄,單擊服務(wù)及函數(shù)。
- 在頂部菜單欄,選擇地域,然后在服務(wù)列表頁(yè)面,單擊目標(biāo)服務(wù)。
- 在函數(shù)管理頁(yè)面,單擊目標(biāo)函數(shù)名稱(chēng)。
- 在函數(shù)詳情頁(yè)面,單擊函數(shù)代碼頁(yè)簽,在代碼編輯器中輸入上述示例代碼,然后單擊部署代碼。說(shuō)明 上述示例代碼中函數(shù)的請(qǐng)求處理程序是
index.php
中的handler
方法。如果您的函數(shù)配置的請(qǐng)求處理程序不同,請(qǐng)?zhí)鎿Q為實(shí)際的文件和方法。 - 單擊測(cè)試函數(shù)。函數(shù)執(zhí)行成功后,查看返回結(jié)果,您可以看到返回結(jié)果為
hello world
。
示例三:調(diào)用外部命令
您的PHP程序也可以創(chuàng)建fork
進(jìn)程,調(diào)用外部命令。
當(dāng)您的PHP函數(shù)需要調(diào)用非PHP語(yǔ)言構(gòu)建的工具,例如Shell、C++或Go編譯的可執(zhí)行文件,您可以將工具與函數(shù)代碼一起打包上傳,然后在函數(shù)中通過(guò)運(yùn)行外部命令來(lái)使用工具。常見(jiàn)的調(diào)用外部命令的方法有exec、system和shell_exec。
以下示例代碼為調(diào)用Linux的ls -halt
命令,輸出當(dāng)前目錄下的文件詳情。
<?php
function handler($event, $context) {
return shell_exec("ls -halt /code");
}