【问题标题】:PHP and AJAX: Echo during processPHP 和 AJAX:进程中的回声
【发布时间】:2016-09-14 18:11:10
【问题描述】:

这里有个小问题。

我有一个通过 AJAX 调用的 php 函数,如下所示:

function processActiveDirectory(){
    $var = new GetLDAPUsers;

    echo "Getting Users from Active Directory.... <br />";        

    $adusers = $var->getAllUsers();
    echo "setting up images.... <br />";
    // processing more stuff
    echo "finished";
}

我正在尝试获取“实时日志”回声。意思是在每一步之前,回声应该输出到一个日志区域,一个接一个。所以用户知道发生了什么。

但问题是,日志在此过程中没有出现,它只是在过程结束时填写整个文本。其他一切正常。 Log 只是在运行时不会出现,但在函数完成后它会出现在正确的位置。

我的 AJAX 调用:

jQuery(document).ready(function($) {
    $('#lii-form').submit(function() {
        data = {
            action: 'lii_map_images'
        };

        $.post(ajaxurl, data, function(response){
            $('#lii_log').html(response);
        });
        return false;
    });
});

这是它的构建方式:

编辑

除了thread,我已经在使用 ajax 调用来调用函数。在被调用的函数中,我正在回显内容...

编辑 2

我正在使用wordpress

很抱歉,由于企业限制,我无法提供更多信息。

【问题讨论】:

标签: php jquery ajax logging echo


【解决方案1】:

这是对您需求的简短概述。请用这个想法进一步发展。

这使用了两个 AJAX 调用 - 一个用于主进程,另一个用于进度:

脚本:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
    //Start the main process
    $.ajax({
        url: 'main.php',
        success: function(data) {
        }
    });

    function getProgress(){
        $.ajax({
            url: 'progress.php',
            success: function(data) {
                $("#progress").html(data);
                if(data != "finished"){
                    getProgress();
                }
            }
        });
    }

    //Start the progress section
    getProgress();
</script>
<div id="progress"></div>

ma​​in.php

<?php
$arr = ['Getting Users from Active Directory....','setting up images....','finished'];
foreach($arr as $value) {
    session_start();
    $_SESSION["progress"]=$value;
    session_write_close();
    sleep(1);
}

progress.php

<?php
session_start();
sleep(1);
echo $_SESSION["progress"];

因此,您的 processActiveDirectory 将归入 Main.php 并且 echo 应替换为 SESSION 变量

【讨论】:

  • 这样吗? $adusers = $var->getAllUsers(); $_SESSION["progress"]= "正在设置图像....
    ";
  • @Zanidd 是的,记得为每次进度更新启动并写入关闭会话,然后才会检测到它。 (我正在尝试寻找多个启动和关闭的替代方案)
  • 它并没有很好地转化为我的代码,我认为这主要是因为它是一个 wordpress 的东西
【解决方案2】:

我认为没有必要使用 AJAX 进行日志处理。 AJAX 太重了,如果你想要它,它可能是一个糟糕的设计。最好使用网络套接字或根本不使用

【讨论】: