使用AJAX查询观察长PHP任务

时间:2017-08-17 09:19:48

标签: php jquery ajax

我试图让进度条观看长PHP函数(+/- 5分钟)。 这个长PHP函数读取CSV文件并在SQL数据库中插入每一行。

在这里,我使用示例PHP长函数(+/- 10s)进行测试。 对于传递的每个循环,值在db&#39> app_loader '中增加。

此函数与ajax调用(POST)异步启动。

我已经制作了一个PHP函数来观察"这个示例长PHP函数。 它查询数据库' app_loader '表格来获取字段' loader_state '和' loader_total '。 此函数返回(echo)json数组,其中包含' load '百分比和' 结束'状态(真或假)。

此函数与ajax调用(GET)异步启动,每500ms重复一次。

我的问题是:观察者ajax调用工作但仅在长任务ajax调用结束时返回值。 因此,当长时间的ajax调用开始时,没有任何东西返回的加载器栏就有点无聊了:(

ajax观察者的结果(每500毫秒):1,2,[...],99,100%

提前多多感谢!

PHP长任务示例函数:

function read_csv($name, $path)
{
    $row = 1;
    while($row < 10)
    {
        // Process (read CSV file and do something) 

        // Set progression in db
        $query = "UPDATE app_loader SET loader_state = :loader_state, loader_total = :loader_total WHERE loader_name = :loader_name";
        $query = self::$db->prepare($query);
        $query->bindValue(':loader_name', 'csv_read', \PDO::PARAM_STR);
        $query->bindValue(':loader_state', $row, \PDO::PARAM_INT);
        $query->bindValue(':loader_total', 9, \PDO::PARAM_INT);
        $query->execute();
        $query = null;

        sleep(1);

        $row++;
    }

    echo json_encode(array('task_ended' => true));
}

PHP观察者功能:

function read_csv_progress()
{
    $query = "SELECT loader_state, loader_total FROM app_loader WHERE loader_name = :loader_name";
    $query = self::$db->prepare($query);
    $query->bindValue(':loader_name', 'csv_read', \PDO::PARAM_STR);
    $query->execute();
    $row = $query->fetch(\PDO::FETCH_OBJ);
    $query = null;

    if($row->loader_state == $row->loader_total)
    {
        echo json_encode(array('load' => self::progress_percent(($row->loader_total), $row->loader_state), 'ended' => true));
    }else{
        echo json_encode(array('load' => self::progress_percent(($row->loader_total), $row->loader_state), 'ended' => false));
    }
 }

ajax长任务调用函数:

function processLongPHPTask(filename, filepath) {
    // Launch watcher
    checkProgress();

    $.ajax({
        type: 'POST',
        url: '/api/map/read/csv/global',
        data: 'name=' + filename + '&path=' + filepath,
        dataType: 'json',
        beforeSend: function (xhr) {
            xhr.setRequestHeader(
                'Authorization',
                'Bearer ' + JWT
            );
        },
        success: function (data) {
            if (data.task_ended) {
                console.log('task ended');
            }
        },
        error: function (xhr, ajaxOptions, thrownError) {
            console.log({
                type: 'error',
                trace: 'processLongPHPTask',
                message: {'status': xhr.status, 'error': thrownError}
            });
        }
    });
}

ajax观察者呼叫功能:

function checkProgress() {

    // Where I call read_csv_progress() from PHP

    $.ajax({
        type: 'GET',
        url: '/api/map/read/csv/global',
        dataType: 'json',
        beforeSend: function (xhr) {
            xhr.setRequestHeader(
                'Authorization',
                'Bearer ' + JWT
            );
        },
        success: function (data) {
            if (data.ended) {
                console.log('data process ended');
            } else {
                console.log('data progress : ' + data.load);

                // Restart the watcher each 500 ms
                setTimeout( checkProgress, 500 );
            }
        },
        error: function (xhr, ajaxOptions, thrownError) {
            console.log({
                type: 'error',
                trace: 'checkProgress',
                message: {'status': xhr.status, 'error': thrownError}
            });
        }
    });
}

0 个答案:

没有答案