AJAX和PHP循环进展wordpress
我尝试为一个简单的
PHP循环制作某种进度指示器.
有一个lot of ajax / php questions here regarding progress and php loops,但在阅读了很多之后,我仍然无法实现(也不能完全理解)逻辑. 他们中的大多数要么是谈论-upload-进度条,要么是针对特定情况过于本地化.(要么就是 – 或者我不知道如何选择正确的搜索关键字.) 我的最终目标是制作一个进度条,但是首先,我尝试了一个回声循环. 我尝试了以下方法: HTML表单: <p class="submit"> <input type="submit" class="button-primary" id="o99_sudi_do_now" value="<?php _e('DO IT NOW !','o99_sudi_domain'); ?>" /> <img src="<?php echo admin_url('/images/wpspin_light.gif'); ?>" class="waiting" id="o99_sudi_loading" style="display:none;"/> </p> <div id="o99_sudi_results"></div> jQuery的 jQuery(document).ready(function($){ jQuery('#o99_sudi_do_now_form').click(function(e){ e.preventDefault(); jQuery.post(ajaxurl,{action:'o99_random_loop'},function(data){ jQuery('#o99_sudi_results').empty().append( data ); }); }); }); PHP function o99_random_loop_cb(){ for ($i = 0; $i < 10; $i++) { //ob_end_clean(); // [TESING] echo '-- step' .$i . ' of 10</br>'; //flush();// [TESING] //usleep(100000000000*0.1); // total time 10 sec.// [TESING] //ob_flush();// [TESING] usleep(20000); } die(); 因为它全部在wordpress管理区域 – add_action( 'wp_ajax_o99_random_loop','o99_random_loop_cb' ); 结果(或输出)是: -- Step 0 of 10 -- Step 1 of 10 -- Step 2 of 10 -- Step 3 of 10 -- Step 4 of 10 -- Step 5 of 10 -- Step 6 of 10 -- Step 7 of 10 -- Step 8 of 10 -- Step 9 of 10 这是好的,但问题是输出到达并且div只在执行完成时更新 – 我希望它在运行中,一步一步地更新…(我真实计划的循环很长,迭代需要大约2-3秒.) 就像你可以看到代码,我已经尝试了flush();,ob_flush();和我见过的任何其他建议,但我怀疑这里的逻辑是错误的(因为它是wordpress ??或在错误的地方冲洗?)实际上,无论我多少次冲洗(); – 结果仅在函数结束时到达.. 我的目标是创建一个进度条 – 但是现在,即使是简单的回音进展也会很有帮助. 解决方法
使用单个POST到PHP无法实现您想要的功能.即使您刷新PHP输出,jQuery端也不会处理结果处理程序,直到整个PHP过程完成.很久以前你只能在文档完成之前开始显示内容的某些浏览器(Netscape等)就可以获得类似这种行为的东西,但是,使用AJAX,在PHP脚本出现之前,你不会看到PHP产生的任何内容.完了.
因此,您一次获得所有输出的原因. 有几种方法可以实现您想要做的事情.一种方法是将PHP循环分解为多个阶段,以便每次只执行一部分循环.然后,您可以执行几次迭代(甚至一次迭代)并将结果返回给浏览器.然后,浏览器将显示结果并再次调用PHP以进行下一次迭代(或迭代集).虽然这会给你你的进度指示器,但它会大大减慢你的整体操作,不推荐. 已编辑以删除因并发问题而无法使用的SESSION: 另一个选择是让PHP将循环的进度保存到数据库,并让浏览器端定期轮询另一个检查数据库以确定进度的PHP脚本.在快速循环中,这将不是那么有用,但在更长的运行循环中,这可能是可行的.因此,与$.post调用一起,您将启动一系列定时$.get调用以检查进度. 编辑: // variable to control polling logic var pollInterval; // Your current post logic here with the addition of a variable to stop execution of the polling process jQuery.post(ajaxurl,function(data){ // post is complete so stop execution window.clearInterval(pollInterval); }); // Now start a get process to get the progress every 5 seconds pollInterval = window.setInterval(function () { // I'm assuming pollingurl is the URL to your PHP script that checks the progress jQuery.get(pollingurl,function(data){ jQuery('#o99_sudi_results').empty().append( data ); }); },5000); 我现在假设在PHP方面,您可以轻松地将进度保存到数据库表并从表中检索所述进度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |