函数计算 php runtime - 如何加载卸载内置扩展

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 在本文中,我们根据一个具体的问题的抛出以及解决的过程,来讲解php runtime 中怎么对 内置的扩展进行加载和卸载。

在本文中,我们根据一个具体的问题的抛出以及解决的过程,来讲解php runtime 中怎么对 内置的扩展进行加载和卸载。

主目录:php runtime FAQ

问题

根据官方文档 php执行环境内置库可以知道, 函数计算环境中内置了tablestore php sdk,但是编写如下代码使用该 sdk 编写如下代码:

<?php

use Aliyun\OTS\Consts\ColumnTypeConst;
use Aliyun\OTS\Consts\PrimaryKeyTypeConst;
use Aliyun\OTS\Consts\RowExistenceExpectationConst;
use Aliyun\OTS\OTSClient as OTSClient;

function handler($event, $context) {
  $logger = $GLOBALS['fcLogger'];
  $logger->info('FC recv:'.$event);
  
  $accessKeyId = $context["credentials"]["accessKeyId"];
  $accessKeySecret = $context["credentials"]["accessKeySecret"];
  $securityToken = $context["credentials"]["securityToken"];
  $endpoint = "cn-shanghai.ots.aliyuncs.com";
  $otsClient = new OTSClient (array (
    'EndPoint' => $endpoint,
    'AccessKeyID' => $accessKeyId,
    'AccessKeySecret' => $accessKeySecret,
    'InstanceName' => 'iot-qyt',
    'StsToken' => $securityToken
  ));
  
  $request = array (
    'table_name' => 'gateway',
    'primary_key' => array ( // 主键
        array('id', 'abcd')
    ),
    "max_versions" => 1
  );
  $response = $otsClient->getRow ($request);
  print json_encode ($response);

  return;
}

点击运行的时候,会出现如下错误:

 {
   "errorMessage": "Call to undefined method Google\\Protobuf\\Internal\\DescriptorPool::getDescriptorByClassName()",
   "errorType": "Error",
   "stackTrace": {
      "file": "/var/fc/runtime/php7.2/builtIn/vendor/aliyun/aliyun-tablestore-sdk-php/src/OTS/ProtoBuffer/Protocol/Message.php",
      "line": 46,
      "traceString": ""
   }
} 

原因

目前函数计算的 php 安装 protobuf 扩展,而tablestore 依赖使用了php 脚本版本的protobuf,此时tablestore sdk 优先使用了扩展,就出现了上面的这种错误

解法

在函数计算的php runtime 中,为了支持用户自定义增加和删减内置扩展,扩展没有采用built-in php 形式,这就给了用户自由操作的空间。在官方教程中,有使用自定义扩展 教程,但是针对内置扩展的选用却没有涉及,在本文中,我们探讨怎么删减或替换内置的扩展。

首先看一下,函数计算有哪些扩展:

extension=session.so
extension=ftp.so
extension=shmop.so
extension=bcmath.so
extension=gettext.so
extension=pcntl.so
extension=simplexml.so
extension=xmlreader.so
extension=bz2.so
extension=gmp.so
extension=pdo.so
extension=soap.so
extension=xmlrpc.so
extension=calendar.so
extension=iconv.so
extension=pdo_mysql.so
extension=sockets.so
extension=xmlwriter.so
extension=ctype.so
extension=imagick.so
extension=phar.so
extension=sysvmsg.so
extension=dom.so
extension=json.so
extension=posix.so
extension=sysvsem.so
extension=exif.so
extension=zip.so
extension=memcached.so
extension=mbstring.so
extension=protobuf.so
extension=sysvshm.so
extension=fileinfo.so
extension=mysqli.so
extension=redis.so
extension=tokenizer.so
extension=zip.so
extension=memcached.so
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so

在这个案例中,我们不希望引入 protobuf 这个 extension 影响 php 版本的google/protobuf 的使用,具体操作如下:

  • 在函数入口文件的相同目录创建一个 extension 目录,目录如下:
.
|____extension
| |____my_ext.ini
|____index.php
  • 编辑 my_ext.ini, 注释掉protobuf。

注:这里可以增加其他extension和注释掉其他不需要的extension, 优化php runtime 的启动速度。

extension=session.so
extension=ftp.so
extension=shmop.so
extension=bcmath.so
extension=gettext.so
extension=pcntl.so
extension=simplexml.so
extension=xmlreader.so
extension=bz2.so
extension=gmp.so
extension=pdo.so
extension=soap.so
extension=xmlrpc.so
extension=calendar.so
extension=iconv.so
extension=pdo_mysql.so
extension=sockets.so
extension=xmlwriter.so
extension=ctype.so
extension=imagick.so
extension=phar.so
extension=sysvmsg.so
extension=dom.so
extension=json.so
extension=posix.so
extension=sysvsem.so
extension=exif.so
extension=zip.so
extension=memcached.so
extension=mbstring.so
;extension=protobuf.so
extension=sysvshm.so
extension=fileinfo.so
extension=mysqli.so
extension=redis.so
extension=tokenizer.so
extension=zip.so
extension=memcached.so
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
  • 基于上述目录的代码包创建函数
  • 设置函数的环境变量,PHP_INI_SCAN_DIR 指向代码目录下面的my_ext.ini, 此时 php 没有加载 protobuf 扩展。

image

这个时候,执行上面有关tablestore的操作就没有问题了。

总结

本文通过一个问题的解法,抛出函数计算环境中怎么加载和卸载扩展的原理和机制,函数计算php runtime 内置组都多的扩展给用户方便的同时,又给与用户更加高阶的对扩展自定义操作,祝大家在世界第一语言的环境中玩的开心。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
17天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
53 1
|
5月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
1月前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
57 3
|
3月前
|
运维 安全 Serverless
Serverless痛点解决问题之Serverless帮助解决 PHP 开发的运维问题如何解决
Serverless痛点解决问题之Serverless帮助解决 PHP 开发的运维问题如何解决
45 0
|
4月前
|
Serverless 文件存储 对象存储
函数计算操作报错合集之如何处理安装了ControlNet但无法加载出预览图并报错
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
函数计算操作报错合集之如何处理安装了ControlNet但无法加载出预览图并报错
|
4月前
|
运维 Serverless API
函数计算产品使用问题之如何使用PHP Runtime非内置扩展
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
|
缓存 运维 监控
Serverless 应用引擎产品使用合集之在使用函数计算 FC 部署 stable-diffusion 应用时,选了 tagger 扩展插件却拿不到提示词,还报错“Error”,是什么原因
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
|
JSON 弹性计算 前端开发
函数计算产品使用问题之遇到在自定义运行时部署React项目时遇到样式无法正常加载。一般是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
运维 Serverless 数据处理
函数计算产品使用问题之 php环境中如何修改PHP允许的文件上传大小和POST最大大小
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
消息中间件 Serverless 文件存储
Serverless 应用引擎产品使用合集之在NAS中下载torch和diffusers依赖包,如何加载
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。

热门文章

最新文章

相关产品

  • 函数计算