WordPress中admin-ajax工作机制及请求阻塞问题咨询
WordPress admin-ajax 请求排队问题解答
为什么同一浏览器多标签页的请求耗时逐次增加?
是的,你观察到的现象确实源于同一登录用户的admin-ajax请求会被串行处理,核心原因是PHP的会话锁机制:
- WordPress默认采用PHP文件会话存储,用户登录后,每个admin-ajax请求都会加载用户会话,此时PHP会对会话文件加排他锁,直到请求执行完成才释放锁。
- 同一浏览器的多个标签页属于同一用户会话,后续请求必须等待前一个请求释放会话锁才能启动,所以标签页2要等标签页1的2秒请求完成,标签页3要等标签页2的请求结束,最终呈现耗时逐次累加的情况。
多用户场景下会出现累计等待吗?
不会。不同用户拥有独立的会话文件,会话锁仅针对单个用户的会话资源生效,彼此之间没有关联。第10位用户的请求会被独立处理,无需等待前面9位用户的请求完成,他的请求耗时仍为正常的2秒左右,不会出现累计20秒的情况。
解决同一用户多请求排队的方案
- 尽早释放会话锁:在admin-ajax的处理逻辑开头,完成会话验证、数据读取等必要操作后,立即调用
session_write_close()释放会话锁,让后续请求可以并行执行,无需等待当前请求完成。 - 更换会话存储方式:改用Redis、Memcached等内存型会话存储,这类存储的锁机制并非排他性的,支持同一用户的多个请求并行处理。
- 异步处理耗时操作:将插入数据库、复杂计算这类耗时操作从admin-ajax请求中剥离,改用WP Cron或消息队列异步执行,缩短单个请求的执行时间,降低排队等待的影响。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

