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

本文涉及的产品
简介: 在本文中,我们根据一个具体的问题的抛出以及解决的过程,来讲解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 内置组都多的扩展给用户方便的同时,又给与用户更加高阶的对扩展自定义操作,祝大家在世界第一语言的环境中玩的开心。

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
11天前
|
运维 Unix Linux
Linux系统 PHP安装expect扩展详解
Linux系统 PHP安装expect扩展详解
44 5
|
7月前
|
Serverless
函数计算,php7.2内置运行时是单并发吗?为什么设置不了并发数?
函数计算,php7.2内置运行时是单并发吗?为什么设置不了并发数?
64 2
|
11天前
|
编译器 API PHP
深入PHP扩展开发:打造高效自定义模块
【4月更文挑战第30天】 在追求性能优化和特定功能实现的道路上,PHP提供了一种强大机制——扩展。本文将引导读者通过编写一个简单的PHP扩展来探索扩展开发的世界。我们将涉及从环境搭建到代码实现,再到扩展的编译与加载的完整流程,确保读者能够理解并实践如何创建高效的自定义PHP模块。
|
11天前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,Php环境,配置取消禁止函数exec如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
59 4
|
11天前
|
Java 中间件 Serverless
Serverless 应用引擎操作报错合集之在阿里函数计算中,云函数怎么一直报错Function instance exited unexpectedly(code 1, message:operation not permitted) with start command 'php server.php '.如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
38 2
|
11天前
|
NoSQL Linux PHP
php添加redis扩展 linux和windos图文详解 l
php添加redis扩展 linux和windos图文详解 l
8 0
|
11天前
|
PHP Windows
php扩展com_dndnet(PHP与.NET框架进行交互)
php扩展com_dndnet(PHP与.NET框架进行交互)
php扩展com_dndnet(PHP与.NET框架进行交互)

热门文章

最新文章

相关产品

  • 函数计算