函式計算 php runtime - 如何載入解除安裝內建擴充套件
在本文中,我們根據一個具體的問題的丟擲以及解決的過程,來講解php runtime 中怎麼對 內建的擴充套件進行載入和解除安裝。
問題
根據官方文件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=mbstring.so extension=protobuf.so extension=sysvshm.so extension=fileinfo.so extension=mysqli.so extension=redis.so extension=tokenizer.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
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=mbstring.so ;extension=protobuf.so extension=sysvshm.so extension=fileinfo.so extension=mysqli.so extension=redis.so extension=tokenizer.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
my_ext.ini
這個時候,執行上面有關tablestore的操作就沒有問題了。
總結
本文通過一個問題的解法,丟擲函式計算環境中怎麼載入和解除安裝擴充套件的原理和機制,函式計算php runtime 內建組都多的擴充套件給使用者方便的同時,又給與使用者更加高階的對擴充套件自定義操作,祝大家在世界第一語言的環境中玩的開心。