在云函数(Serverless Cloud Function,SCF)已支持的开发语言及版本的标准运行环境外,为了满足更多个性化开发语言及版本的函数实现,SCF 提供了 Custom Runtime 服务,即可定制化运行环境。通过开放实现自定义函数运行时,支持根据需求使用任意开发语言的任意版本来编写函数,并实现函数调用中的全局操作,如扩展程序的加载,安全插件,监控 agent 等。SCF 与 Custom Runtime 通过 HTTP 协议通信完成事件的响应处理。
这里让我们尝试体验一下scf的自定义运行时功能,部署在scf上部署下php8.0并带上pgsql的插件用来访问pg数据库
基础环境准备
首先准备 一台安装了centos 7 系统的设备或者docker容器,确保和scf运行环境一致,避免so文件依赖导致的一些错误。然后让我们来安装基础环境。
代码语言:txt复制 yum install gcc gcc-c gdb libxml2-devel.x86_64 sqlite-devel.x86_64 postgresql-server postgresql-devel
然后下载并解压缩php8.0的源代码
代码语言:txt复制wget https://www.php.net/distributions/php-8.0.0.tar.gz
tar -zxvf php-8.0.0.tar.gz
编译并安装
接下来配置并编译php 框架
代码语言:txt复制cd php-8.0.0
./configure --prefix=/opt/php80/ --enable-debug --enable-fpm --enable-cli --with-pgsql=/usr/lib64 --with-pdo-pgsql=/usr/lib64 --with-openssl
make -j8
make install
cp php.ini-production /opt/php80/lib/php.ini
这里让我们看一下需要注意的地方
- configure这一步的时候我们需要看到如下的提示信息才能说明配置成功,如果其中出现了任何错误关键词的话,一般来说多少缺少相关依赖,通过yum安装依赖后再进行尝试。 config.png
- 我们通过指定了 prefix 让程序在make install的时候会把php框架安装到opt/php80下,通过with-pgsql/with-pdo-pgsql指定了编译的时候讲pgsql的支持编译到框架内部,后续不再需要通过php.ini里面指定插件来使用pgsql。
- make -j8 是因为笔者使用的编译设备是8核心设备,启动8线程编译可以对编译速度有所提升,建议实际编译的时候这里的属性根据自己的设备核心数来合理配置。
编译插件并安装(可选)
如果在编译安装的时候,忘记了某些功能,后续又想加上,那么可以这样操作。这里我们用openssl来举例子,编译openssl插件,假设我们在第一步编译框架的时候忘记加上--with-openssl 了,那么我们的框架就不支持TLS了,这在现代互联网大量使用https的情况下是难以接受的,所以我们可以通过额外的插件编译来补充功能。
代码语言:txt复制cd php-8.0.0/ext/openssl
/opt/php80/bin/phpize
./configure --with-php-config=/opt/php80/bin/php-config
make
make install
执行这些步骤后openssl.so会被安装到框架的插件目录下,然后需要编辑php.ini启动插件,将如下行加入到php.ini中
代码语言:txt复制extension=openssl.so
现在我们的框架可以支持https了,如果有其他的插件需要安装,操作方式也是类似的。
打包框架并作为层上传
到目前为止,我们的框架已经编译成功了,我们现在可以将它压缩并作为层上传到scf
代码语言:txt复制cd /opt
zip -q -r php.zip php80/
使用scf的层功能上传框架
然后由于我们要使用到pgsql,php的pgsql插件是基于libpq.so实现的,所以我们也要将依赖的so文件打包
代码语言:txt复制mkdir clibs
cd clibs
cp /usr/lib64/libpq.so.5.5 ./libpq.so.5
zip -q -r customlib.zip *
上传补充的so文件包,这个包解压后会被部署在scf的opt文件夹下,scf默认的LD_LIBRARY_PATH环境变量会从opt下寻找需要加载的so文件。
在我们完成层的创建后,我们可以创建需要运行的函数主体了,填写函数名并制定自定义运行时,点击下一步
在第二次函数配置中上传打包好的php代码,详细代码可以参考我们的实例代码库
最后打开高级配置并绑定层,可以点击添加层来添加多个层绑定,点击完成,等待scf函数生成。
最后我们可以看到这样的一个界面就说明完成了scf函数上传。
修改一下index.php中的pgsql的连接字符配置为自己的pgsql配置,然后运行测试函数,可以看到函数的正常运行和返回。
同时我们可以在pgsql的db里面看到插入的数据,注意这里笔者用的databases名称是phptest,表名称是scflog,测试前请确保表存在,如果修改了表名称需要对应修改index.php第六行的插入语句表名称。
到这里我们完成scf自定义运行时使用php 8.0框架,同时还使用了scf官方默认php运行时不支持的插件,看起来体验是不是非常不错,心动不如行动,赶快试试吧。