Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
Php 处理过程中的页面更新_Php_Ajax_Laravel 5 - Fatal编程技术网

Php 处理过程中的页面更新

Php 处理过程中的页面更新,php,ajax,laravel-5,Php,Ajax,Laravel 5,我有一个PHP脚本,可能需要几分钟才能完成。这是一个搜索引擎,它执行一系列regex命令并向用户检索结果 我首先显示一个加载页面,该页面对控制器中的大处理方法进行AJAX调用,我们称之为“p”。然后这个方法返回一个部分视图,我只是用这个部分视图替换我的加载页面内容。它很好用 现在我想做的是给用户一些关于这个过程的信息,然后对它进行一些控制,比如脚本已经找到了多少个结果。为了实现这一点,我每5秒进行一次AJAX调用,该调用应该检索当前数量的结果,并将其显示在一个简单的html元素中。此调用在与方法

我有一个PHP脚本,可能需要几分钟才能完成。这是一个搜索引擎,它执行一系列regex命令并向用户检索结果

我首先显示一个加载页面,该页面对控制器中的大处理方法进行AJAX调用,我们称之为“p”。然后这个方法返回一个部分视图,我只是用这个部分视图替换我的加载页面内容。它很好用

现在我想做的是给用户一些关于这个过程的信息,然后对它进行一些控制,比如脚本已经找到了多少个结果。为了实现这一点,我每5秒进行一次AJAX调用,该调用应该检索当前数量的结果,并将其显示在一个简单的html元素中。此调用在与方法“P”相同的控制器中使用方法“R”

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

会话变量“file”驱动程序:在“P”中,我首先将会话变量“v”设置为0,然后在每次找到新结果时更新“v”R'只返回response->jsonsession'v' 控制器变量:与上述原理相同,但我使用在控制器顶部声明的变量。 对“p”的AJAX调用在这两种情况下都有效,但每次和在这两种情况下都返回0。如果我在“P”脚本末尾发回“v”,则它具有正确的值

因此,在我看来,“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
}

我建议在这里采用不同的方法。 阅读更多关于刷新内容的信息,然后使用它

长话短说为了显示通过刷新处理的行数,您可以创建一个循环结果并不时刷新,或者以一个或多个精确的行数刷新,不再需要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\u cgi,因为要激活输出缓冲,您需要禁用一些重要功能。

我相信您遇到了PHP限制。PHP也不支持多线程。为了达到交互级别,您可能需要直接编辑会话文件,其路径可以在您的会话中找到。通过php_info保存_path global,您可以使用编辑此路径。虽然这不是推荐的用法,但风险自负

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

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

当你考虑并发时,这个问题会出现,如果布尔略微被编辑,或者同时作为计数数组,该怎么办?也许您只是不断地中断更新文件,直到另一个脚本得到消息。然而,这并不是一个优雅的解决方案

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

如果有这个选项,我个人会在JSP或ASP.NET中重写代码


总而言之,对于一个不可靠的功能来说,这需要做大量的工作。

您是否使用innoDB作为数据库中的引擎?如果您想向用户显示结果计数,您可以简单地计算返回行数,并将其作为控制器返回参数的一部分。如果我没有记错,我使用的是PostgreSQL,它有自己的存储引擎。谢谢Anand,但我真的不明白你的意思。我想做的是在脚本仍在处理时显示结果的数量。您可以将其视为某种进度条:在脚本完成之前,每隔x秒,我希望用户知道已经找到了多少个结果。在我看来,您应该返回找到的结果以及到目前为止找到的总结果数。您可以保存在每个ajax请求中找到的总结果,并将其与url一起发送回,然后您的控制器再次计算总的当前结果加上以前找到的结果,并再次将合并的数字作为ajax的返回发送回。控制器返回的对象应该包含结果和当前计数。如果我最终成功使刷新工作,请参见下面的答案,如果我
希望用户能够中断进程AJAX调用,以更新某种使大进程停止的变量。我可能需要一个AJAX调用的解决方案,如果你能为我指出关于这一部分的正确方向的话。嗯,也许我说的是废话,但当流程开始时,也许你可以找到流程的pid,将它存储在每个用户或smth的文本文件中,然后进行ajax调用,从该文件读取pid并突然终止线程?难不好,安全问题可能会在那里出现。。。