函数计算PHP Runtime - exception 处理

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 本文中,详细解析了函数计算 php runtime 中对于异常的处理, 在php runtime 中,严格规范代码,我们期望加强检查以便减少用户编写diamante犯错的可能,但是针对一些第三方库的引入使用可能因为warning或者notice而无法使用时,函数计算允许用户通过自定义的set_error_handler来覆盖runtime中默认处理。

主目录:php runtime FAQ

在本文中,我们来细化讲讲函数计算中 php runtime 中的异常处理问题,在官方文档中 php runtime 错误处理 没有讲解函数计算php runtime 环境中对于具体的错误类型是怎么处理的?比如级别很低的notice或者warning, 先来看几个例子:

example

Warning

<?php
function handler($event, $context) {
  $a = 1/0;
  return "ok";
}

执行结果:

{
   "errorMessage": "Division by zero",
   "errorType": "ErrorException",
   "stackTrace": {
      "file": "/code/index.php",
      "line": 3,
      "traceString": ""
   }
} 

NOTICE

<?php
function handler($event, $context) {
  $a = ["a" => 1, "b" => 2];
  $b = $a["c"];
  return "ok";
}

执行结果:

 {
   "errorMessage": "Undefined index: c",
   "errorType": "ErrorException",
   "stackTrace": {
      "file": "/code/index.php",
      "line": 11,
      "traceString": ""
   }
} 

从上面两个例子我们可以看出,函数计算的 php runtime 对代码检查十分严格,不管什么级别的ERROR_TYPE, 都是按照异常来处理,但是有些使用有些php库的时候,可能会有一些warning或者notice,这个时候会导致在函数计算的环境中不能使用这种php 库,比如aliyun-openapi-php-sdk

比如下面的代码:

<?php

require_once __DIR__ . '/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';
use imm\Request\V20170906 as Imm;

define('PREVIEWURL', 'https://preview.imm.aliyun.com/index.html');

function handler($event, $context) {
    $accessKeyId     = $context["credentials"]["accessKeyId"];
    $accessKeySecret = $context["credentials"]["accessKeySecret"];
    $securityToken   = $context["credentials"]["securityToken"];
    $region          = $context['region'];

    $iClientProfile = DefaultProfile::getProfile(
        $region,
        $accessKeyId,
        $accessKeySecret,
        $securityToken
    );

    $client         = new DefaultAcsClient($iClientProfile);
    $PREVIEWTGTPATH = 'fc-demo-preview-output-php';
    $immProject     = "imm-demo";
    $srcUri         = "oss://fc-imm-demo/test-data/office/test.pptx";

    $bucket   = "fc-imm-demo";
    $fileName = "test.pptx";
    $tgtUri   = sprintf("oss://%s/%s/%s", $bucket, $PREVIEWTGTPATH, $fileName);

    $request = new Imm\CreateOfficeConversionTaskRequest();
    $request->setProject($immProject);
    $request->setSrcUri($srcUri);
    $request->setTgtType("vector");
    $request->setTgtUri($tgtUri);
    $response = $client->getAcsResponse($request);
    print_r($response);
}

执行就会收到这个错误, 上面 example 中的 NOTICE 转变为exception:

 {
   "errorMessage": "Undefined index: cn-hangzhou#imm",
   "errorType": "ErrorException",
   "stackTrace": {
      "file": "/code/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Regions/LocationService.php",
      "line": 58,
      "traceString": ""
   }
} 

php runtime 中自定义error_handler

当遇见上面所述对的问题时,我们如何规避这种问题呢?答案是使用set_error_handler 来定义自己的处理方法,从而屏蔽runtime中严格处理, 对于 Warning 和 Notice 这种级别等错误, 详情可以参考:http://www.php.net/manual/zh/function.set-error-handler.php

对于上面这种问题,我们修改代码如下:

<?php

require_once __DIR__ . '/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';
use imm\Request\V20170906 as Imm;

define('PREVIEWURL', 'https://preview.imm.aliyun.com/index.html');

function myErrorHandler($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        return false;
    }

    switch ($errno) {
    case E_USER_ERROR:
        $errInfo = array(
            "errorMessage" => $errstr,
            "errorType"    => \ServerlessFC\friendly_error_type($errno),
            "stackTrace"   => array(
                "file" => $errfile,
                "line" => $errline,
            ),
        );
        throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
        break;

    default: // E_USER_WARNING | E_USER_NOTICE
        break;
    }

    /* Don't execute PHP internal error handler */
    return true;
}

function handler($event, $context) {
    // set to the user defined error handler
    set_error_handler("myErrorHandler");
    
    $accessKeyId     = $context["credentials"]["accessKeyId"];
    $accessKeySecret = $context["credentials"]["accessKeySecret"];
    $securityToken   = $context["credentials"]["securityToken"];
    $region          = $context['region'];

    $iClientProfile = DefaultProfile::getProfile(
        $region,
        $accessKeyId,
        $accessKeySecret,
        $securityToken
    );

    $client         = new DefaultAcsClient($iClientProfile);
    $PREVIEWTGTPATH = 'fc-demo-preview-output-php';
    $immProject     = "imm-demo";
    $srcUri         = "oss://fc-imm-demo/test-data/office/test.pptx";

    $bucket   = "fc-imm-demo";
    $fileName = "test.pptx";
    $tgtUri   = sprintf("oss://%s/%s/%s", $bucket, $PREVIEWTGTPATH, $fileName);

    $request = new Imm\CreateOfficeConversionTaskRequest();
    $request->setProject($immProject);
    $request->setSrcUri($srcUri);
    $request->setTgtType("vector");
    $request->setTgtUri($tgtUri);
    $response = $client->getAcsResponse($request);
    print_r($response);
}

总结

本文中,详细解析了函数计算 php runtime 中对于异常的处理, 在php runtime 中,严格规范代码,我们期望加强检查以便减少用户编写代码犯错的可能,但是针对一些第三方库的引入使用可能因为warning或者notice而无法使用时,函数计算允许用户通过自定义的set_error_handler来覆盖runtime中默认处理。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
Serverless
函数计算,php7.2内置运行时是单并发吗?为什么设置不了并发数?
函数计算,php7.2内置运行时是单并发吗?为什么设置不了并发数?
88 2
|
5月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
缓存 运维 Serverless
函数计算产品使用问题之如何在Custom Runtime中引用层中的依赖
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
存储 Java Serverless
函数计算产品使用问题之Custom Runtime函数的详细配置包括哪些
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
运维 安全 Serverless
Serverless痛点解决问题之Serverless帮助解决 PHP 开发的运维问题如何解决
Serverless痛点解决问题之Serverless帮助解决 PHP 开发的运维问题如何解决
45 0
|
4月前
|
运维 Serverless API
函数计算产品使用问题之如何使用PHP Runtime非内置扩展
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎产品使用合集之php工程已经部署,可以正常访问数据库,静态资源样式无法正常加载,要怎么配置
|
5月前
|
运维 Serverless 数据处理
函数计算产品使用问题之 php环境中如何修改PHP允许的文件上传大小和POST最大大小
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之如何使用PHP SDK调用函数并在请求体(body)中传递字符串
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,Php环境,配置取消禁止函数exec如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
344 4

热门文章

最新文章

相关产品

  • 函数计算