同时 AJAX 请求互相阻塞
在某些情况下,AJAX 请求可能不会同时运行,从而导致意外行为。当用户遇到两个并发 AJAX 请求的问题时,就会出现此问题,这两个请求旨在在将数据导出到 XSLX 文件时显示进度。第一个请求触发了一个冗长的 PHP 脚本,第二个请求定期检查进度更新。
经过调查,发现第二个 AJAX 请求在执行之前等待第一个 AJAX 请求完成。此行为归因于 PHP 中的会话阻塞。
PHP 中的会话阻塞
默认情况下,PHP 使用文件来存储会话数据。当会话启动时(使用 session_start() 函数),PHP 打开会话文件进行写入并锁定它以确保独占访问。这种锁定机制可以防止并发请求同时访问文件。结果,第二个 AJAX 请求必须等待第一个 AJAX 请求完成并解锁会话文件才能执行。
解决方案
此问题的解决方案问题是禁用 PHP 默认的基于文件的会话存储,或者在写入会话文件后显式关闭会话文件,释放锁定。
要禁用基于文件的会话存储,请将以下行添加到 php.ini file:
session.save_path =
要显式关闭会话文件,请使用 session_write_close() 函数:
<code class="php"><?php session_start(); $_SESSION['foo'] = 'bar'; // Write data to the session session_write_close(); // Close the session file echo $_SESSION['foo']; // You can still read from the session. ?></code>
通过实现这些解决方案,您可以确保第二个 AJAX 请求将同时执行与第一个一样,让您可以毫不拖延地跟踪进度。
以上是为什么我的 AJAX 请求在 PHP 中会互相阻塞?的详细内容。更多信息请关注PHP中文网其他相关文章!