
# 开发PHP事件函数
PHP的事件函数开发，支持本地开发后上传代码文件，也支持直接在FunctionGraph控制台创建函数在线编辑PHP函数代码。
关于PHP函数的接口定义以及SDK接口说明请参考[PHP函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0506.html)。
#### 约束与限制
- 函数仅支持返回如下几种类型的值。
  - Null：函数返回的HTTP响应Body为空。
  
  - string：函数返回的HTTP响应Body内容为该字符串内容。
  
  - 其他：函数会返回值作为对象进行json编码，并将编码后的内容作为HTTP响应的Body，同时设置响应的"Content-Type"头为"text/plain"。
   
- **当函数的事件源是APIG时，相关约束条件请参考[Base64解码和返回结构体的说明](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0102.html#functiongraph_02_0102__li176282148442)。**
- 本例函数工程文件保存在"\~/Code/"文件夹下，在打包的时候务必进入Code文件夹下选中所有工程文件进行打包，这样做的目的：由于定义了FunctionGraph函数的index.php是程序执行入口，确保fss_examples_php7.3.zip解压后，index.php文件位于根目录。
 
#### 开发PHP函数
1. 创建函数 
   1. 编写打印helloworld的代码。 打开文本编辑器，编写helloworld函数，代码如下，文件命名为"helloworld.php"，保存文件。
      ```
      <?php
      function printhello() {
      echo 'Hello world!';
      }
      ```
      
   
   2. 定义FunctionGraph函数
      打开文本编辑，定义函数，代码如下，文件命名为index.php，保存文件（与helloworld.php保存在同一文件夹下）。
      ```
      <?php
      include_once 'helloworld.php';
       
      function handler($event, $context) {
          $output = json_encode($event);
          printhello();
          return $output;
      }
      ```
      
   
   
   
   
2. 工程打包 
   函数工程创建以后，可以得到以下目录，选中工程所有文件，打包命名为"fss_examples_php7.3.zip"，如[图1]所示。
   图1工程打包   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000001212744650.png "点击放大")
   
   
3. 创建FunctionGraph函数，上传程序包 
   登录FunctionGraph，创建PHP函数，上传[fss_examples_php7.3.zip](https://functionstage-examples.obs.cn-north-1.myhuaweicloud.com/fss_examples_php7.3.zip)文件。如 ++[图2]++ 所示。
   图2上传程序包   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000001257384517.png "点击放大")
   - 函数执行入口中的index与步骤[定义FunctionGraph函数]的文件名保持一致，通过该名称找到FunctionGraph函数所在文件。
   
   - 函数执行入口中的handler为函数名，与步骤[定义FunctionGraph函数]中创建的index.php文件中的函数名保持一致。
   
   
   函数执行过程为：用户上传fss_examples_php7.3.zip保存在OBS中，触发函数后，解压缩zip文件，通过index匹配到FunctionGraph函数所在文件，通过handler匹配到index.php文件中定义的FunctionGraph函数，找到程序执行入口，执行函数。
   ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   **修改函数执行入口：**
   在FunctionGraph控制台左侧导航栏选择"函数 \> 函数列表"，单击需要设置的"函数名称"进入函数详情页，选择"设置 \> 常规设置"，配置"函数执行入口"参数，如[图3]所示。
   图3函数执行入口   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002360873948.png "点击放大")
   
   
4. 测试函数 
   1. 创建测试事件。
      在函数详情页，单击"配置测试事件"，弹出"配置测试事件"页，输入测试信息如[图4]所示，单击"创建"。
      图4配置测试事件   
      ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002394514097.png "点击放大") 
   
   2. 在函数详情页，选择已配置测试事件，单击"测试"。
   
   
   
   
5. 执行函数 
   函数执行结果分为三部分，分别为函数返回（由return返回）、执行摘要、日志输出（由echo方法获取的日志方法输出）。
   
   
 
#### 执行结果
执行结果由3部分组成：函数返回、执行摘要和日志。
表1执行结果说明 
| 参数项  | 执行成功                          | 执行失败                                                                                                                                                                                                                                                                                               |
|:---|:---|:---|
| 函数返回 | 返回函数中定义的返回信息。                 | 返回包含错误信息、错误类型和堆栈异常报错信息的JSON文件。格式如下： ``` { "errorMessage": "", "errorType": "", "stackTrace": {} } ``` errorMessage：Runtime返回的错误信息 errorType：错误类型 stackTrace：Runtime返回的堆栈异常报错信息 |
| 执行摘要 | 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 | 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。                                                                                                                                                                                                                                                                      |
| 日志   | 打印函数日志，最多显示4KB的日志。            | 打印报错信息，最多显示4KB的日志。                                                                                                                                                                                                                                                                                 |
   
