如何在AWS Lambda Layer中导入PHP cURL模块问题求助
问题诊断与操作指引
你收到的Call to undefined function curl_init()报错,核心原因是当前使用的PHP Lambda运行环境没有内置cURL扩展,你之前引用的默认PHP73公共层未打包cURL模块,需要自定义Lambda Layer添加扩展解决,具体操作步骤如下:
1 编译cURL扩展并打包自定义层
必须在和Lambda运行环境一致的Amazon Linux 2环境下编译扩展,推荐用本地Docker模拟运行时环境操作:
- 拉取对应PHP版本的Lambda运行时容器镜像,进入容器终端
- 安装编译依赖包,执行命令:
yum install -y curl-devel php-devel gcc make - 编译cURL扩展:进入PHP扩展源码目录,依次执行
phpize、./configure、make、make install - 按Lambda层要求整理文件结构:
- 创建层级目录
/opt/php/7.3/lib/php/extensions/no-debug-non-zts-20180731/,将编译生成的curl.so文件放入该目录 - 创建
/opt/php/7.3/conf.d/目录,新建curl.ini文件写入内容:extension=curl.so
- 创建层级目录
- 将整个
opt目录打包为zip文件,注意zip根目录直接是opt文件夹,不要嵌套多余的外层目录
2 上传层并绑定到Lambda函数
- 进入AWS Lambda控制台,左侧菜单栏选择「层」,点击「创建层」,上传刚才打包的zip文件,选择兼容的运行时和对应架构(x86/Arm)
- 回到你的PHP Lambda函数配置页,找到「层」模块点击「添加层」,选择你刚创建的自定义层后保存配置
3 修正代码隐含问题
你当前代码中cURL配置项的键加了引号,属于错误写法,curl_setopt_array无法识别字符串格式的配置常量,需要修改为如下格式:
$curl_options = array( CURLOPT_URL => $url, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_USERAGENT => 'ezPay', CURLOPT_FOLLOWLOCATION => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $parameter );
完成上述操作后重新部署Lambda,即可正常调用cURL相关函数,不会再报未定义错误。
内容的提问来源于stack exchange,提问作者GoRo
相关产品推荐
相关产品推荐

