如何在DDEV环境正确配置PHP memory_limit解决Shopware6内存溢出报错
DDEV环境Shopware6 API内存耗尽问题排查与配置方法
问题根因前置说明
报错信息里的Allowed memory size of 1073741824 bytes exhausted中,1073741824字节恰好等于1024MB,和你设置的memory_limit = 1024M完全匹配,说明web请求实际生效的内存限制就是1G,拉取11000条商品时,Shopware完成模型组装、响应序列化的过程中内存占用超过阈值,最终在sendContent()输出阶段触发致命错误。
你之前通过SSH进容器拿到的memory_limit => -1是PHP CLI模式的配置,DDEV默认给CLI模式设置无内存限制,方便运行composer、批量处理脚本,但网站接口请求走的是PHP-FPM进程,两者配置完全独立,CLI的配置结果不能代表web请求的实际生效值,你猜测的“无上限配置导致服务异常”不成立。
排查步骤
- 第一步:校验web请求实际生效的PHP配置
在项目public目录下新建临时文件phpinfo_check.php,内容为<?php phpinfo();,通过浏览器访问https://sw6.ddev.site/phpinfo_check.php,搜索memory_limit项,这里显示的值才是接口请求实际加载的内存限制值,验证完成后立刻删除该临时文件避免安全风险。 - 第二步:排查配置覆盖项
检查两个位置是否存在手动配置的内存限制覆盖php.ini设置:- 项目根目录及
public目录下的.user.ini文件,是否存在memory_limit = xxx配置 - 项目
public目录下的.htaccess文件,是否存在php_value memory_limit xxx配置
存在上述配置的话直接删除即可。
- 项目根目录及
- 第三步:确认你之前修改的php.ini路径无效
你修改的/var/www/html/config/etc/php7/conf.d/php.ini不属于DDEV默认加载的PHP配置路径,直接进容器修改文件的方式也会在容器重建后全部丢失,不会持久生效。
DDEV环境正确设置PHP memory_limit的方法
不要进入容器内部修改配置,使用DDEV提供的持久化配置方式,修改后重启服务即可生效:
- 方法1(推荐,可统一管理所有自定义PHP配置)
在项目根目录的.ddev目录下新建php文件夹(如果不存在则手动创建),在文件夹内新建自定义配置文件比如shopware-php.ini,写入需要的配置:[Date] date.timezone="UTC" memory_limit = 2048M upload_max_filesize = 6M max_execution_time = 30 - 方法2(命令行快速设置)
在项目根目录执行DDEV配置命令直接设置内存限制:ddev config --php-memory-limit 2048M
配置完成后执行重启命令让配置加载到FPM和CLI进程:
ddev restart
重启完成后回到之前的phpinfo校验页面,确认memory_limit已经更新为你设置的值即可。
优化建议
拉取11000条全量商品时,Shopware默认会序列化所有关联字段、扩展属性,内存占用高属于正常现象,如果不需要全量字段,可以在API请求中通过associations参数指定需要拉取的字段、关闭不必要的关联查询,能大幅降低内存占用,不需要盲目调高内存限制。
内容的提问来源于stack exchange,提问作者kekw
相关产品推荐
相关产品推荐

