Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jQuery progressbar显示长时间运行的PHP脚本的进度_Php_Jquery_Ajax_Progress Bar - Fatal编程技术网

使用jQuery progressbar显示长时间运行的PHP脚本的进度

使用jQuery progressbar显示长时间运行的PHP脚本的进度,php,jquery,ajax,progress-bar,Php,Jquery,Ajax,Progress Bar,有时候,jQuery的文档让我觉得自己是个傻瓜 我有一个应用程序,它在服务器上使用PHP处理多个订单的创建(有时超过1000个)。我试图弄清楚如何让脚本(通过$.ajax调用)通知UI它的状态 我理解$.ajax中的.onprogress、.success和.complete元素,但是我找不到PHP脚本应该如何向这些事件类型提供数据的示例 在老式javascript中,使用ajax.readyState,您可以从脚本中获取PHP.echo()事件以用于进度,然后使用PHP.exit()事件完成请

有时候,jQuery的文档让我觉得自己是个傻瓜

我有一个应用程序,它在服务器上使用PHP处理多个订单的创建(有时超过1000个)。我试图弄清楚如何让脚本(通过$.ajax调用)通知UI它的状态

我理解$.ajax中的.onprogress、.success和.complete元素,但是我找不到PHP脚本应该如何向这些事件类型提供数据的示例

在老式javascript中,使用ajax.readyState,您可以从脚本中获取PHP.echo()事件以用于进度,然后使用PHP.exit()事件完成请求

在$.ajax的世界中,人们是如何做到这一点的


非常感谢一只老狗尝试学习新把戏。

用蛮力的方法解决了这个问题

每次从服务器端echo()时,捆绑包都会作为e.target.responseText传递给onprogress处理程序。请注意,responseText会随着每个响应不断增长,因此您需要一个客户端变量来跟踪其先前的长度:

var this_str, last_len = 0;
...
onprogress: function (e) {
    this_str = e.target.responseText.substr(last_len);
    ...do something with this_str...
    last_len = e.target.responseText.length;
}
...
如果结果是json,则需要解码此字符串(而不是responseText)。使用不同的技术效果最好,因为根据服务器更新的频率,解析可能会过载。由于您发送的是json对象,所以整个responseText字符串是一系列json对象,由右大括号“}{”和右大括号“}{”分隔。因此,请将其分成几个部分,并使用最新的:

var subtext, parts, json;
...
onprogress: function (e) {
    parts = e.target.responseText.split('}{');
    if (parts.length > 1) {
        subtext = '{' + parts[parts.length - 1];
    } else {
        subtext = parts[0];
    }
    json = JSON.parse(subtext);
    ...
success函数对json使用类似的方法:

success: function (text) {
    parts = text.split('}{');
    if (parts.length > 1) {
        subtext = '{' + parts[parts.length - 1];
    } else {
        subtext = parts[0];
    }
    json = JSON.parse(subtext);
    ...
请注意,随着事情的开始,将会有一些无用的onprogress事件;请确保对这些事件进行测试并忽略它们

当服务器端函数终止或退出()时,success函数和onprogress函数都将收到完整的responseText字符串。如果要在success中执行其他操作,请记住跟踪responseText中的最后一个字符串