jQuery:我可以在更长的$ .ajax请求待处理时发送和接收$ .ajax响应吗?

ksb*_*b86 9 php mysql ajax jquery insert

情况:
我正在使用$ .ajax()POST向php脚本发送请求,该脚本将大约400,000-500,000行插入到db中.这一直需要3.5到4分钟.(在此期间,请求是PENDING).

问题:
我需要一些方法来显示页面上的进度.(比如一个 %).我尝试在setInterval中使用$ .ajax(),每隔5秒左右检查一次,但是它们似乎会在第一个(更长的)$ .ajax()完成时生成.

问题:
默认情况下不是$ .ajax()async吗?这不应该意味着请求可以在任何时间以任何顺序发送,并且应该以任何顺序随时收到响应吗?这甚至与异步有什么关系吗?有没有办法定期从一个请求发回'半响应'?或者,当有待处理的请求/响应时,我是否无法发送和接收请求/响应?(见下面的精彩图纸)

提前致谢!!!

多次请求http://kshaneb.com/reqres.png

opt*_*iks 8

您长时间运行的ajax调用可能会在服务器上打开一个会话,因此会话文件锁定会阻止所有下一个请求.

问题: 默认情况下,PHP会将其会话数据写入文件.当请求启动会话的PHP脚本(session_start())时,此会话文件被锁定.这意味着如果您的网页向PHP脚本发出大量请求,例如,通过Ajax加载内容,则每个请求都可能锁定会话并阻止其他请求完成.其他请求将挂起session_start(),直到会话文件解锁.如果您的一个Ajax请求相对较长,那么这尤其糟糕.

解决方案: 会话文件保持锁定状态,直到脚本完成或手动关闭会话.要阻止多个PHP请求(需要$ _SESSION数据)阻止,您可以启动会话,然后关闭会话.这将解锁会话文件并允许其余请求继续运行,甚至在初始请求完成之前.

更多信息:http: //konrness.com/php5/how-to-prevent-blocking-php-requests/

  • [最好](http://meta.stackexchange.com/q/8259)在此处包含答案的基本部分(不仅是原因,还包括解决方案),并提供参考链接. (2认同)

Ora*_*ill 1

您可以发布到 iframe 并让 php 生成增量输出并使用刷新命令发送它,而不是执行 ajax post。

 // send a hash mark for every 1000 inserts
 $a = 0;
 while ($rec = getDataForNextInsert()){
       $a++;
       // do insert
       if ($a%1000 == 0) { echo '#'; flush(); }
 }
Run Code Online (Sandbox Code Playgroud)

然后还可以轮询 iframe 的内容,为最终用户提供漂亮的显示。