如何在基于SAM模板的Bref Laravel AWS Lambda应用中安装ffi扩展
问题:Bref Laravel Lambda镜像部署下安装FFI扩展以支持rd-kafka
前提条件
我使用Bref在AWS Lambda上运行PHP Laravel应用,技术栈固定且必须通过SAM模板配置(不可用serverless)。Lambda以Docker镜像形式部署,从ECR拉取运行——这是确保脚本兼容所有Laravel依赖的唯一方式。原本应用运行正常,但需要发送Kafka消息时发现,必须安装ffi扩展才能使用rd-kafka库,仅在php.ini中启用无效。
Bref与SAM模板配置限制
最初考虑通过Lambda层配置Kafka依赖及ffi扩展,但SAM模板设置为PackageType: Image后,无法使用任何Lambda层(包括Bref官方层),添加Layers或Handler属性会导致sam deploy报错。
Amazon Linux 2上安装FFI扩展的尝试与问题
只能将所有依赖整合到同一镜像中:
- 尝试用
install-php-extensions脚本安装ffi,但Bref要求的基础镜像bref/php-83基于类CentOS的Amazon Linux系统,使用yum包管理器,该脚本不兼容,执行报错。 - 下载对应版本的PHP源码,通过
yum安装了所有必要依赖:libxml2-devel、sqlite-devel、libffi-devel、php-devel、re2c、bison、autoconf、make、libtool、librdkafka。但出现加载错误:
尽管已将Unable to load dynamic library 'ffi' (tried: /opt/bref/extensions/ffi (/opt/bref/extensions/extensions/ffi: cannot open shared object file: No such file or directory), /opt/bref/extensions/ffi.so (libffi.so.7: cannot open shared object file: No such file or directory)) in Unknown on line 0ffi.so复制到/opt/bref/extensions/extensions目录,文件存在且权限正确,执行yum groupinstall "Development Tools"也无济于事。 - 进入
/usr/src/php-src/ext/ffi目录执行/usr/bin/phpize准备扩展,回到源码根目录执行./buildconf生成configure文件,再执行:
启用FFI并指定./configure --with-ffi FFI_LIBS=/ext/ffi --with-config-file-scan-dir=/opt/bref/etc/php/conf.d --with-libdir=lib64 FFI_LIBS=/usr/lib64/libffi.so路径,但make接近完成时出现链接错误。 - 尝试下载libffi源码并调整配置参数,
make仍出现相同链接错误。
后续进展与待解决问题
目前只能尝试调整FFI_LIBS和FFI_CFLAGS环境变量解决问题。目标是让基于Bref的Laravel Lambda应用(由SQS触发)能够发送Kafka消息,当前应用运行正常,但Kafka功能因FFI扩展无法加载而失效。
更新:通过执行以下命令解决了编译错误:
./configure --with-ffi --with-config-file-scan-dir=/opt/bref/etc/php/conf.d PKG_CONFIG_PATH=/usr/src
成功完成make和make install后,仍出现ffi.so加载错误,推测可能存在多PHP版本冲突,寻求其他解决方案。
环境信息:
- PHP版本:
8.3.16 - 系统版本:
Amazon Linux 2
内容的提问来源于stack exchange,提问作者Nick Melton
相关产品推荐
相关产品推荐

