PHP AMQP Lib+Docker环境下RabbitMQ消息重复发送问题排查
排查RabbitMQ消息重复发送问题
可能原因及排查方向
浏览器自动请求
favicon.ico触发重复执行
浏览器访问页面时会默认请求站点的favicon.ico文件,如果Nginx未单独处理该请求,而是将其转发到PHP-FPM执行你的脚本,就会导致脚本被调用两次,发送两条消息。
排查方式:查看Nginx访问日志(执行docker logs <nginx容器名>),确认是否存在两个请求:一个是你访问的脚本路径,另一个是/favicon.ico。Nginx配置存在重复的请求转发规则
检查Nginx配置文件,是否有多个location块匹配到目标PHP脚本路径,导致同一请求被多次转发到PHP-FPM。比如同时配置了location ~ \.php$和其他匹配该脚本的规则,或规则存在重叠。脚本输出的无效资源引用触发二次请求
即便页面无重定向,如果脚本输出的内容中包含不存在的图片、CSS等资源,浏览器会尝试请求这些资源;若Nginx将不存在的资源也转发到PHP脚本,同样会导致重复执行。
解决方案
单独处理
favicon.ico请求
在Nginx配置中添加专属location块,避免转发到PHP:location = /favicon.ico { log_not_found off; access_log off; return 204; }清理Nginx重复规则
确保只有一个location块负责处理PHP脚本请求,标准配置示例:location ~ \.php$ { fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }检查脚本资源引用
确认脚本输出的HTML中没有引用不存在的资源,或为这些资源配置正确的Nginx处理规则。
验证方法
修改PHP脚本,在发送消息的代码前添加请求日志:
file_put_contents('/var/log/php_requests.log', date('Y-m-d H:i:s') . ' - ' . $_SERVER['REQUEST_URI'] . "\n", FILE_APPEND);
通过浏览器访问脚本后,查看日志文件,确认是否有两个不同请求触发了脚本执行。
内容的提问来源于stack exchange,提问作者DannyXCII
相关产品推荐
相关产品推荐

