全部產品
Search
文件中心

Function Compute:請求處理常式(Handler)

更新時間:Jul 06, 2024

您可以使用PHP請求處理常式響應接收到的事件並執行相應的商務邏輯。本文介紹PHP請求處理常式的相關概念、結構和使用樣本。

什麼是請求處理常式

FC函數的請求處理常式,是函數代碼中處理請求的方法。當您的FC函數被調用時,Function Compute會運行您提供的Handler方法處理請求。您可以通過Function Compute控制台請求處理常式配置Handler。

對PHP語言的FC函數而言,您的請求處理常式格式為檔案名稱.方法名。例如,您的檔案名稱為main.php,方法名為handler,則請求處理常式為main.handler

關於FC函數的具體定義和相關操作,請參見建立事件函數

請求處理常式的具體配置均需符合Function Compute平台的配置規範。配置規範因請求處理常式類型而異。

Handler簽名

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

<?php

function handler($event, $context) {
  return 'hello world';
}

樣本解析如下:

  • handler:方法名稱。與Function Compute控制台配置的請求處理常式相對應。例如,為FC函數配置的請求處理常式index.handler,那麼Function Compute會去載入index.php中定義的handler函數,並從handler函數開始執行。

  • $event:您調用函數時傳入的參數,其資料類型是字串。PHP函數直接使用您指定的event參數,不會做任何預先處理,您在函數中可以根據實際情況解析event。例如,輸入資料是JSON字串,您可以把輸入的資料轉換為Array。

  • $context:包含函數的運行時資訊,例如請求ID和臨時身分識別驗證,便於您在代碼中使用這些資訊。

說明

如您需要通過HTTP觸發器或自訂網域名訪問函數,請先擷取請求結構體再自訂HTTP響應。更多資訊,請參見HTTP觸發器調用函數

樣本一:解析JSON格式參數

範例程式碼

當您傳入JSON格式參數時,Function Compute會透傳參數內容,需要您在代碼中自行解析。下面是解析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. 登入Function Compute控制台,在左側導覽列,單擊函數

  2. 在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。

  3. 在函數配置頁面,選擇代碼頁簽,在代碼編輯器中輸入上述範例程式碼,然後單擊部署代碼

    說明

    上述範例程式碼中函數的請求處理常式是index.php中的handler方法。如果您的函數的請求處理常式配置不同,請擷取對應的檔案和方法進行更新。

  4. 代碼頁簽,單擊測試函數右側的down表徵圖,從下拉式清單中選擇配置測試參數,輸入如下樣本測試參數,然後單擊確定

    {
      "key1": "value1",
      "key2": "value2",
      "key3": {
        "v1": true,
        "v2": "bye",
        "v3": 1234
      }
    }
  5. 單擊測試函數

    執行成功後,您從返回結果中可以看到函數成功返回了上面的JSON格式,並且日誌輸出裡列印了key1key2key3的內容。

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

範例程式碼

您可以使用Function Compute為您提供的臨時密鑰訪問Object Storage ServiceOSS,程式碼範例如下所示。

<?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. 登入Function Compute控制台,在左側導覽列,單擊函數

  2. 在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。

  3. 在函數配置頁面,選擇代碼頁簽,在代碼編輯器中輸入上述範例程式碼,然後單擊部署代碼

    說明

    上述範例程式碼中函數的請求處理常式是index.php中的handler方法。如果您的函數配置的請求處理常式不同,請替換為實際的檔案和方法。

  4. 單擊測試函數

    函數執行成功後,查看返回結果,您可以看到返回結果為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");
}        

樣本四:使用HTTP觸發器調用函數

範例程式碼

<?php

function handler($event, $context) {
  $logger = $GLOBALS['fcLogger'];
  $logger->info('hello world');
  $logger->info('receive event: ' . $event);
  
  try {
    $evt = json_decode($event, true);
    if (is_null($evt['body'])) {
      return "The request did not come from an HTTP Trigger, event: " . $event;
    }
    $body = $evt['body'];
    if ($evt['isBase64Encoded']) {
      $body = base64_decode($evt['body']);
    }
    return array(
      "statusCode" => 200,
      'headers' => array("Content-Type" => "text/plain"),
      'isBase64Encoded' => false,
      "body" => $body
    );
  } catch (Exception $e) {
      $logger->error("Caught exception: " . $e->getMessage());
      return "The request did not come from an HTTP Trigger, event: " . $event;
  }
}

前提條件

已使用上述樣本建立運行環境為PHP的函數,並建立HTTP觸發器。具體操作,請參見建立事件函數配置HTTP觸發器並使用HTTP觸發

操作步驟

  1. 登入Function Compute控制台,在左側導覽列,單擊函數

  2. 在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。

  3. 在函數詳情頁面,單擊配置頁簽,然後再左側導覽列,單擊觸發器,在觸發器頁面擷取HTTP觸發器的公網訪問地址。

  4. 在Curl工具執行以下命令,調用函數。

    curl -i "https://http-trigger-demo.cn-shanghai.fcapp.run" -d 'Hello FC!'
    重要
    • 如果HTTP觸發器的認證方式無需認證,您可以直接使用Postman或Curl工具來調用函數。具體操作,請參見本文操作步驟

    • 如果HTTP觸發器的認證方式簽名認證JWT認證,請使用簽名方式或JWT認證方式來調用函數。具體操作,請參見認證鑒權

錯誤分析

本範例程式碼支援使用HTTP觸發器或者自訂網域名調用。如果使用API調用函數,但配置的測試參數不符合HTTP觸發器請求格式規範時,會出現報錯。

例如,在控制台上調用函數,配置請求參數為 "Hello, FC!",單擊測試函數,收到的請求響應如下所示。

The request did not come from an HTTP Trigger, event: Hello FC!