繁体   English   中英

网页和此网页触发的php脚本之间的通信

[英]Communication between web page and php script triggered from this web page

我在某些控制器中有一个myAction函数。 它具有一个类实例:

public function myAction() {

    ...
    $myAnalyzer = new Analysis();
    $myAnalyzer->analyze();
    ...
}

假设此函数analytics()需要10分钟。 这意味着它将阻止my.phtml 10分钟,这是不可接受的。 我想要的是先呈现my.phtml,然后在my.phtml上显示来自analyzer()的中间结果。

function analyze() {

... 
    foreach($items as $rv) {

        ...
        ...
        // new result should be stored in db here 
    }

}

据我所知,这是不可能的,因为PHP中只有一个线程。 因此,我决定从my.phtml进行ajax调用以运行myAnalyzer实例。

第一个问题:是吗? 我可以在myAction()中做到这一点而不会阻塞吗?

好的,现在我在javascript或JQuery的帮助下,使用my.phtml中的某些脚本(例如worker.php)运行myAnalyzer。

第二个问题:我怎么知道每个foreach循环何时结束? 换句话说,如何让worker.php向my.phtml或zend框架发送一些信号(或事件)。 我不想使用javascript计时器在一段时间内更新my.phtml。 我只需要知道这些,因为中间数据应该存储在DB中。

第三个问题:当用户离开页面时,myAnalyzer陷入困境。 为此,我有这段代码。

window.onbeforeunload = function(e) {

    // killer.php kills myAnalyzer
};

但是,javascript如何与myAnalyzer通信? 是否有类似process-id的内容? 我的意思是,当worker.php运行myAnalyzer时,它将在zend框架中注册其进程ID。 并且当用户离开页面时,killer.php使用此process-id停止myAnalyzer。

我先感谢您的帮助。

第一问:是的,恐怕是正确的。

第二问:我不明白你在这里是什么意思。 请参见下面的代码示例

foreach($data => $item) {
   ...
}
//code here will be executed only after foreach loop is done. 

第三问:看一下这个页面。 您可以将其设置为false(但我想它已经是那样了),并不时将某些内容发送给客户端。 或者,您可以将其设置为true并检查用户是否仍通过connection_aborted函数进行connection_aborted 我的意思是,您可以使用ajax运行worker.php并配置您的请求,这样浏览器就不会因为超时而断开连接(因此,连接将在用户停留在页面上时保持连接)。 但是如果用户离开页面,它将关闭。

编辑:关于第二个问题。 有几种选择:

1)您可以使用一些共享内存(例如,memcached)。 并不时用另一个ajax请求呼叫服务器。 因此,在每个循环结束之后-您将一些值放入memcached中,并且在请求期间,您可以检查该值并根据该值建立响应/更新页面

2)有部分响应之类的东西。 使用XMLHTTPRequest可能会获得一些响应,但是正如我所记得的那样,由于许多浏览器不支持该响应,因此此刻并没有真正的用处。 我对此没有任何细节。 从未尝试使用它,但我可以肯定地知道某些浏览器允许使用XMLHTTPRequest处理部分响应。

3)您可以使用不可见的iframe而不是XMLHTTPRequest来调用worker.php。 在这种情况下,您可以在其中放置javascript的地方发送一些内容,这将在parrent窗口中调用某个函数,并且该函数将更新您的页面。 如果您想了解更多信息,那是长轮询COMET的实现之一。 有一些陷阱(例如,您可能需要确保发送一些特殊的符号作为响应,以便在某些浏览器中执行它),但仍然可以使用(某些网络浏览器聊天基于这个)。

2)和3)也很不错,因为它将自动解决您的第三个问题。 同时1)可能更简单,但是它不能解决第三个问题中的问题。

还有一件事-因为您将使用长时间运行的脚本,因此必须记住该会话可能会阻止其他任何请求的执行(如果使用了基于默认文件的PHP会话-肯定会发生)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM