duanfu1873 2017-06-02 15:17
浏览 51
已采纳

如何在未完成时从ajax触发的PHP调用获取更新?

Is there a way to get updates from a PHP process while it's not finished and it has been called by ajax? By updates i mean flushed output from the PHP script.

var proc;
$('#start').click(function () {
    proc = $.ajax({
        type: 'POST',
        url: 'execute.php',
        // getData function that will get me updated data
        getData: function (update){
            alert(update);
        }
    });
});

UPDATE: Lets say we want to get that echo before this ends.

execute.php

<?php
$progress = 0;
while(1){
    $progress++;
    echo $progress;
    flush();
    sleep(5);
    if($progress == 100){
        break;
    }
}
?>

FINAL:

myScript.js

var strongcalcs;
var source;
$('#start').click(function () {
    strongcalcs = $.ajax({
        type: 'POST',
        url: 'execute.php',
        beforeSend: function () {
            rpm_percent();
        },
        success: function(result){
            source.close();
        },
        complete: function () {
            source.close();
        },
        error: function () {
            source.close();
        }
    });
});

function rpm_percent() {
    source = new EventSource("execute.php");
    if(typeof(EventSource) !== "undefined") {
        source.onmessage = function(event) {
            console.log(event.data);
        };
    } else {
        alert("nono");
    }
}

execute.php

<?php
$coco = 0;
function sendMsg($msg, &$coco) {
    echo "id: " . $coco . "
";
    echo "data: " . $msg;
    echo "
";
    echo "
";
    ob_flush();
    flush();
    $coco++;
}

header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
$progress = 0;
while(1){
    sendMsg($progress++, $coco);
    ob_flush();
    flush();
    sleep(5);
    if($progress == 100){
        break;
    }
}
?>
  • 写回答

2条回答 默认 最新

  • duanpao4172 2017-06-02 15:22
    关注

    I've in the past used Server Sent Events for this (https://www.w3schools.com/html/html5_serversentevents.asp). Internet Explorer is not supported out of the box, but there are polyfills that can solve the issue.

    I think Websockets do something similar but don't have experience with those myself.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题