处理时页面更新

时间:2015-04-10 13:21:22

标签: php ajax laravel-5

我有一个PHP脚本可能需要几分钟才能完成。它是一些搜索引擎,它执行一堆正则表达式命令并将结果检索给用户。

我首先显示一个"加载页面"它对我控制器中的大处理方法进行了AJAX调用(让我们称之为' P')。然后这个方法返回一个局部视图,我只是替换我的"加载页面"具有该局部视图的内容。它工作正常。

现在我想要做的是向用户提供有关该过程的一些信息(以及稍后对它的一些控制),比如脚本已经找到了多少结果。为了达到这个目的,我每5秒做一次另一个AJAX调用,它应该检索当前的结果数并将其显示在一个简单的html元素中。此通话使用了一种方法' R'与方法' P'。

在同一控制器中

现在我遇到的问题是我无法检索到正确的当前结果数。我尝试了两件事:

  • 会话变量('文件'驱动程序):在' P'我首先设置一个会话变量' v'到0然后更新' v'每次找到新结果。 ' R'只需返回response()->json(session('v'))
  • 控制器变量:与上述原理相同,但我使用在控制器顶部声明的变量。

AJAX致电' P'适用于这两种情况,但每次都会返回0.如果我发回'' v'在P'结束时脚本,它具有正确的值。

所以对我而言,看起来像是' R'无法访问' v'的实际当前值,它只能访问某些缓存的'版本。

有没有人知道我将如何实现我想做的事情?还有另一个"清洁剂"我的做法和/或出了什么问题?

谢谢你,祝你有愉快的一天!

__

一些伪代码希望能让它更加精确。

SearchController.php

function P() {
    $i = 0;
    session(['count' => $i]); // set session variable
    $results = sqlQuery(); // get rows from DB

    foreach ($results as $result) {

        if (regexFunction($result))
            $i++

        session(['count' => $i]); // update session variable

    }

    return response()->json('a bunch of stuff');
}

function R() {
    return response()->json(session('count')); // always returns 0
}

2 个答案:

答案 0 :(得分:0)

我会在这里推荐一种不同的方法。 在此处阅读有关刷新内容的更多信息http://php.net/manual/en/ref.outcontrol.php,然后使用它。

长话短说明为了显示用刷新处理的行数你可以只做一个循环结果并不时刷新或者在一个确切的数字或行,需要5秒AJAX消失。未经测试的小例子:

$cnt = 0;
foreach($result as $key => $val) {
     //do your processing here
     if ($cnt % 100 == 0) {
          //here echo smth for flushing, you can echo some javascript, tough not nice
          echo "<script>showProcess({$cnt});</script>";
          ob_flush();
     }
}
// now render the proccessed full result

在showProcess javascript函数中制作你想要的东西......一些jquery替换为文本或一些图形内容......

希望您没有使用fast_cgi,因为为了激活输出缓冲,您需要禁用一些重要功能。

答案 1 :(得分:0)

我相信你已经遇到了PHP限制。 PHP没有多线程,好吧。要实现交互级别,您可能需要直接编辑会话文件,其路径可以通过php_info()在session.save_path global中找到,您可以使用session_save_path(String)编辑此路径。虽然不建议使用此选项,但需自行承担风险。

或者使用存储在计算机/服务器某处的JSON TXT文件,以与会话文件类似的方式识别它们。

您应该将查询的当前进度存储到文件中,如果事务已被用户中断。在继续迭代结果集之前,应检查中断位/布尔值的状态。

当你考虑并发时会出现这个问题,如果在计数数组之前或者同时编辑布尔值,该怎么办?也许您只是继续使用中断更新文件,直到其他脚本获取消息。然而,这不是一个优雅的解决方案。

此解决方案也不允许同一用户运行并发查询。为了解决这个问题,应该对会话文件执行额外的检查以确定某些内容是否已在运行。应标记错误以通知用户。

考虑到这个选项,我个人会在JSP或ASP.NET中重写代码

总而言之,这对于一个不可靠的功能来说是很多工作。