Magento 2.2.0 Redis Session启用后,未登录用户Ajax加购失败求助
我来帮你梳理下这个问题的排查方向,这类Redis Session和访客Ajax加购的问题通常和会话一致性、配置或者请求上下文有关,一步步来:
先确认Redis Session配置的正确性
打开app/etc/env.php,检查session节点的配置:'session' => [ 'save' => 'redis', 'save_path' => 'tcp://127.0.0.1:6379?database=0', 'redis' => [ 'host' => '127.0.0.1', 'port' => '6379', 'password' => '', 'timeout' => '2.5', 'persistent_identifier' => '', 'database' => '0', 'compression_threshold' => '2048', 'compression_library' => 'gzip', 'log_level' => '1', 'max_concurrency' => '6', 'break_after_frontend' => '5', 'break_after_adminhtml' => '30', 'first_lifetime' => '600', 'bot_first_lifetime' => '60', 'bot_lifetime' => '7200', 'disable_locking' => '0', 'min_lifetime' => '60', 'max_lifetime' => '2592000' ] ]确保
save是redis,save_path格式正确,Redis的主机、端口、数据库和实际服务匹配。然后用命令redis-cli ping验证Redis服务是否正常响应,没有连接或权限问题。检查Ajax请求的会话传递
访客的购物车是和frontend会话Cookie绑定的,用浏览器开发者工具打开Network面板,查看加购的Ajax请求:- 确认Request Headers里的
Cookie字段包含frontend=xxx(xxx是你的会话ID) - 如果是跨域请求,要确保Ajax请求设置了
withCredentials: true;同域请求也要确保浏览器没有阻止Cookie携带
如果会话Cookie没被传递,服务器会创建新的会话,加购的商品会存在新会话里,前端自然看不到。
- 确认Request Headers里的
查看Magento日志找静默异常
Ajax请求返回成功不代表后台没有报错,去var/log/system.log和var/log/exception.log里搜索相关关键词,比如redis、session、quote、add to cart,看看有没有会话写入失败、Redis连接异常或者购物车quote更新失败的日志。验证Redis中的会话数据
用Redis命令行工具检查访客会话是否被正确存储和更新:- 执行
redis-cli keys "*frontend*"获取所有访客会话键 - 用
redis-cli get <你的会话键>查看会话内容,确认里面有quote_id字段 - 加购后再次获取会话内容,检查
quote_id对应的购物车是否新增了商品(可以结合数据库的quote_item表验证)
- 执行
检查购物车Quote和会话的关联
去数据库执行SQL:SELECT * FROM quote WHERE customer_id IS NULL ORDER BY updated_at DESC LIMIT 10;找到最近的访客quote,查看
items_count和items_qty字段,加购后这两个值应该变化。如果没有变化,说明quote没有被正确更新,问题可能出在会话和quote的绑定上。排除缓存干扰
暂时禁用全页缓存(FPC)和页面缓存,测试Ajax加购是否正常。有些老版本的FPC可能会导致访客会话识别异常,尤其是在Ajax请求场景下。考虑版本兼容性问题
Magento 2.2.0是比较旧的版本,可能存在Redis Session和Ajax请求兼容的bug。可以查看官方的补丁列表,或者升级到2.2.x的最新小版本(比如2.2.10),看看是否有相关的修复补丁。比如部分旧版本中,Ajax请求的会话写入存在延迟或丢失的情况。对比非Ajax加购的情况
测试直接点击加购按钮跳转到购物车页面的场景,如果非Ajax加购正常,那问题就集中在Ajax请求的会话处理上,重点排查请求头、会话传递的配置。
内容的提问来源于stack exchange,提问作者Kirti Nariya

