如何调试解决PHP、Laravel、Shopware并发请求导致的死锁问题
嵌套API调用并发死锁问题调试求助
架构配置
- 面向客户端的Laravel项目
- 内部Shopware 6项目
Laravel通过REST API对外提供服务,部分API请求会通过Guzzle内部调用Shopware获取客户或店铺信息,单请求/低并发场景下一切正常,但多并发请求时会出现失效问题。
问题现象
当多个店铺相关API请求同时发起时,Shopware无法及时收到Laravel的内部调用。这些内部请求会被延迟到Laravel请求因超时失败后才被Shopware处理,此时Shopware完成请求返回响应,但Laravel已经不再监听,完全拿不到结果。
具体时间线:
- 多个外部请求到达Laravel
- Laravel开始处理这些请求
- Laravel向Shopware发起内部API请求
- Laravel因等待超时停止监听内部请求的响应
- Laravel向外部返回错误响应
- Shopware才开始处理之前被延迟的内部请求
- Shopware完成请求,但Laravel已无监听,响应完全作废
假设推测
Laravel的外部请求占用了所有可用的并发连接资源,导致内部请求无法被发送到Shopware,形成死锁:外部请求等待内部请求的响应,而内部请求则等待外部请求释放连接资源才能被处理。
思考分析
已排除锁机制问题:只有在多并发嵌套调用时才会出现异常,少量请求完全正常;而且Laravel请求超时前,Shopware的index.php首行代码都没有被执行过。推测是系统并发连接数达到上限,内部请求被排队,直到外部请求释放连接后才会被处理,但目前无法验证这个猜测。
已尝试的解决方案
- 调整Apache的
mpm_prefork_module参数,提升并发配置:
<IfModule mpm_prefork_module> StartServers 50 MinSpareServers 50 MaxSpareServers 150 MaxRequestWorkers 150 MaxConnectionsPerChild 5000 </IfModule>
结果:没有任何改善
- 将Laravel和Shopware的数据库分离到不同实例(Laravel用MySQL5,Shopware用MySQL8),规避数据库锁带来的影响
结果:没有任何改善
环境信息
- macOS Ventura
- MAMP Pro 6.6
- Apache 2.4.46
- MySQL 5.7.34
求助需求
希望得到调试及解决该并发死锁问题的具体建议。
内容的提问来源于stack exchange,提问作者zZeepo
相关产品推荐
相关产品推荐

