本文介紹PHP事件請求處理程序的結構和使用示例。

Event Handler簽名

一個簡單的Event Handler簽名定義如下。

<?php

function handler($event, $context) {
  return 'hello world';
}
Event Handler的示例解析如下:
  • handler:方法名稱。與函數計算控制臺配置的請求處理程序相對應。例如,為FC函數配置的請求處理程序index.handler,那么函數計算會去加載index.php中定義的handler函數,并從handler函數開始執行。
  • $event:您調用函數時傳入的參數,其數據類型是字符串。PHP函數直接使用您指定的event參數,不會做任何預處理,您在函數中可以根據實際情況解析event。例如,輸入數據是JSON字符串,您可以把輸入的數據轉換為Array。
  • $context:包含函數的運行時信息,例如請求ID和臨時身份驗證,便于您在代碼中使用這些信息。

示例一:解析JSON格式參數

示例代碼

當您傳入JSON格式參數時,函數計算會透傳參數內容,需要您在代碼中自行解析。下面是解析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;
}

前提條件

創建運行環境為PHP的函數。具體操作,請參見創建函數

操作步驟

  1. 登錄函數計算控制臺,在左側導航欄,單擊服務及函數
  2. 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊目標函數名稱。
  4. 函數詳情頁面,單擊函數代碼頁簽,在代碼編輯器中輸入上述示例代碼,然后單擊部署代碼
    說明 上述示例代碼中函數的請求處理程序是index.php中的handler方法。如果您的函數配置的請求處理程序不同,請替換為實際的文件和方法。
  5. 函數代碼頁簽,單擊測試函數右側的down圖標,從下拉列表中選擇配置測試參數,輸入如下示例測試參數,然后單擊確定
    {
      "key1": "value1",
      "key2": "value2",
      "key3": {
        "v1": true,
        "v2": "bye",
        "v3": 1234
      }
    }
  6. 單擊測試函數
    執行成功后,您從返回結果中可以看到函數成功返回了上面的JSON格式,并且日志輸出里打印了key1key2key3的內容。

示例二:通過臨時密鑰安全讀寫OSS的資源

示例代碼

您可以使用函數計算為您提供的臨時密鑰訪問對象存儲OSS,代碼示例如下所示。

<?php

use OSS\OssClient;
use OSS\Core\OssException;

function handler($event, $context) {
    /*
      阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。
      建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
      本示例以從上下文中獲取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參數中獲取臨時密鑰,避免在代碼中硬編碼密碼等敏感信息。
  • 以上代碼表示將/code/index.php文件上傳到OSS的randombucketexampledir目錄下。
    說明 請根據實際情況,將endpointbucketobjectfilePath替換為真實的資源名稱。

前提條件

操作步驟

  1. 登錄函數計算控制臺,在左側導航欄,單擊服務及函數
  2. 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊目標函數名稱。
  4. 函數詳情頁面,單擊函數代碼頁簽,在代碼編輯器中輸入上述示例代碼,然后單擊部署代碼
    說明 上述示例代碼中函數的請求處理程序是index.php中的handler方法。如果您的函數配置的請求處理程序不同,請替換為實際的文件和方法。
  5. 單擊測試函數
    函數執行成功后,查看返回結果,您可以看到返回結果為hello world

示例三:調用外部命令

您的PHP程序也可以創建fork進程,調用外部命令。

當您的PHP函數需要調用非PHP語言構建的工具,例如Shell、C++或Go編譯的可執行文件,您可以將工具與函數代碼一起打包上傳,然后在函數中通過運行外部命令來使用工具。常見的調用外部命令的方法有execsystemshell_exec

以下示例代碼為調用Linux的ls -halt命令,輸出當前目錄下的文件詳情。

<?php

function handler($event, $context) {
  return shell_exec("ls -halt /code");
}