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吗?这不应该意味着请求可以在任何时间以任何顺序发送,并且应该以任何顺序随时收到响应吗?这甚至与异步有什么关系吗?有没有办法定期从一个请求发回'半响应'?或者,当有待处理的请求/响应时,我是否无法发送和接收请求/响应?(见下面的精彩图纸)
提前致谢!!!
您长时间运行的ajax调用可能会在服务器上打开一个会话,因此会话文件锁定会阻止所有下一个请求.
问题: 默认情况下,PHP会将其会话数据写入文件.当请求启动会话的PHP脚本(session_start())时,此会话文件被锁定.这意味着如果您的网页向PHP脚本发出大量请求,例如,通过Ajax加载内容,则每个请求都可能锁定会话并阻止其他请求完成.其他请求将挂起session_start(),直到会话文件解锁.如果您的一个Ajax请求相对较长,那么这尤其糟糕.
解决方案: 会话文件保持锁定状态,直到脚本完成或手动关闭会话.要阻止多个PHP请求(需要$ _SESSION数据)阻止,您可以启动会话,然后关闭会话.这将解锁会话文件并允许其余请求继续运行,甚至在初始请求完成之前.
更多信息:http: //konrness.com/php5/how-to-prevent-blocking-php-requests/
您可以发布到 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 的内容,为最终用户提供漂亮的显示。