加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

AJAX和PHP循环进展wordpress

发布时间:2020-12-16 02:49:35 所属栏目:百科 来源:网络整理
导读:我尝试为一个简单的 PHP循环制作某种进度指示器. 有一个lot of ajax / php questions here regarding progress and php loops,但在阅读了很多之后,我仍然无法实现(也不能完全理解)逻辑. 他们中的大多数要么是谈论-upload-进度条,要么是针对特定情况过于本地
我尝试为一个简单的 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方面,您可以轻松地将进度保存到数据库表并从表中检索所述进度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读