天天看點

函數計算 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 擴充。
函數計算 php runtime - 如何加載解除安裝内置擴充

這個時候,執行上面有關tablestore的操作就沒有問題了。

總結

本文通過一個問題的解法,抛出函數計算環境中怎麼加載和解除安裝擴充的原理和機制,函數計算php runtime 内置組都多的擴充給使用者友善的同時,又給與使用者更加高階的對擴充自定義操作,祝大家在世界第一語言的環境中玩的開心。