有一个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 ); }); }); });
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 ??或在错误的地方冲洗?)实际上,无论我多少次冲洗(); – 结果仅在函数结束时到达..
我的目标是创建一个进度条 – 但是现在,即使是简单的回音进展也会很有帮助.
解决方法
因此,您一次获得所有输出的原因.
有几种方法可以实现您想要做的事情.一种方法是将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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。