在函数计算服务使用 PHP 编程,需要定义一个函数作为入口函数。本文介绍了 PHP HTTP 函数的结构和特点。

HTTP 函数定义

以下代码示例定义了一个基本的 PHP HTTP 入口函数。

<?php
use RingCentral\Psr7\Response;
function handler($request, $context): Response{
    /*
    $body       = $request->getBody()->getContents();
    $queries    = $request->getQueryParams();
    $method     = $request->getMethod();
    $headers    = $request->getHeaders();
    $path       = $request->getAttribute("path");
    $requestURI = $request->getAttribute("requestURI");
    $clientIP   = $request->getAttribute("clientIP");
    */

    return new Response(
        200,
        array(
            "custom_header1" => "v1",
            "custom_header2" => ["v2", "v3"],
            "Set-Cookie" => urlencode("test php") . '=' . urlencode('test;more')
        ),
        "hello world"
    );
}        
说明 建议您所有的响应头都放在构造响应对象的参数里面,例如上述示例。不要单独使用能改变 header 的方法,例如 headersetcookie 等。

HTTP 函数 $context 参数

$context 参数与事件函数中的 $context 参数相同,详情请参见事件函数 $context 参数

HTTP 函数 $request 参数

$request 参数遵循 PSR(HTTP message interfaces)标准。更多详情请参见 PSR-7-http-message。具体的代码定义遵循 PSR Http Message

$request 参数携带的可用信息代码示例如下:

<?php
    $queries = $request->getQueryParams();
    $method = $request->getMethod();
    $headers = $request->getHeaders();
    $path = $request->getAttribute("path");
    $requestURI = $request->getAttribute("requestURI");
    $clientIP = $request->getAttribute("clientIP");
    $body = $request->getBody()->getContents();        
参数 类型 描述
$headers Array 存放来自 HTTP 客户端的键值对,键值对中的值为数组类型,遵循 PSR-7 标准。
$path String HTTP URL 中的路径。
$queries Array 存放来自 HTTP URL 中的查询部分的键值对,键值对中的值可以是字符串或数组。
$method String HTTP 方法。
$clientIP String HTTP 客户端的 IP 地址。
$requestURI String 请求中除 host 以外的 URL。
$body String HTTP 请求中的请求体数据。
说明 函数计算会默认使用一些系统定义字段,不支持自定义。因此,您的 headers 的键中不能使用系统定义字段,例如 accept-encodingconnectionkeep-aliveproxy-authorizationtetrailertransfer-encoding 和以 x-fc- 开头的字段。

HTTP 函数 $response 参数

$response 遵循 PSR(HTTP message interfaces)标准。以下代码为 Response 构造示例。

<?php
/**
     * @param int    $status  Status code for the response, if any.
     * @param array  $headers Headers for the response, if any.
     * @param mixed  $body    Stream body.
     */
    public function __construct(
        $status = 200,
        array $headers = array(),
        $body = null,
    ) 
    {
       //...
    }       
说明 body 可以是字符串,也可以是 Stream。如果使用 Stream 格式,必须要实现 PSR-7-http-message 标准中的 StreamInterface API 接口。

PHP HTTP 函数示例

下文代码示例演示了如何使用 HTTP 函数中的 $request$Response

use RingCentral\Psr7\Response;
function php_http_handler($request, $context): Response{
    $body = $request->getBody()->getContents();
    $queries = $request->getQueryParams();
    $method = $request->getMethod();
    $headers = $request->getHeaders();
    $path = $request->getAttribute("path");
    $requestURI = $request->getAttribute("requestURI");
    $clientIP = $request->getAttribute("clientIP");

    $params = array(
        'method' => $method,
        'clientIP' => $clientIP,
        'requestURI' => $requestURI,
        'path' => $path,
        'queriesMap' => $queries,
        'headersMap' => $headers,
        'body' => $body,
    );

    $respHeaders = array('Content-Type' => 'application/json');
    $respBody = json_encode($params);
    return new Response(200, $respHeaders, $respBody);
}            

限制说明

  • 请求限制

    如果超过以下限制,会返回 400 状态码和 InvalidArgument 错误码。

    字段 限制说明 HTTP 状态码 错误码
    headers 请求头中的所有键和值的总大小不能超过 4 KB。 400 InvalidArgument
    path 请求路径以及所有查询参数的总大小不能超过 4 KB。
    body HTTP body 的总大小不能超过 6 MB。
  • 响应限制

    如果超过以下限制,会返回 502 状态码和 BadResponse 错误码。

    字段 限制说明 HTTP 状态码 错误码
    headers 响应头中的所有键和值对的大小不能超过 4 KB。 502 BadResponse
    body HTTP body 的大小不能超过 6 MB。

更多信息

PHP 运行环境的详细信息,请参见 PHP 运行环境