最近发现了一个ajax异步请求的问题,用$.post、$.get、$.ajax请求PHP服务器时,总是无法异步返回数据。
经多次测试才发现:
-- 不同浏览器,请求不同域名-不阻塞:无需实验
-- 不同浏览器,请求同域名-不阻塞:session_id()返回不同
-- 同一浏览器,请求不同域名-不阻塞:session_id返回不同
-- 同一浏览器,请求同域名-阻塞:session_id()返回相同
发现问题所在:
1 关闭XDEBUG
2 SESSION锁
3 清除输出缓冲区
1 关闭XDEBUG
XDEBUG是实时调试。调试时,它将保持FPM以确保线程正在工作以避免数据污染。
典型的测试方法是,使用XDEBUG进行调试时,打开另一个浏览器并访问该站点,该站点这个时候是无法访问的。
这对并行响应有重大影响,即,即使前端发送多个请求,它也受XDEBUG控制,并且只能同时响应一个。
另外,由于XDEBUG依赖于SESSION,因此即使您使用session_write_close(),也要关闭会话锁(请参见下文)。
XDEBUG仍会自动打开。
2 SESSION锁
用 session_write_close() 关闭SESSION的写锁,这适合SESSION保存为File的情况。
如果SESSION保存在Redis,则不需要。
3 清除输出缓冲区
使用session_write_close()可能无法立即关闭SESSION锁&#