检测用户中止/导航 websocket

Posted

技术标签:

【中文标题】检测用户中止/导航 websocket【英文标题】:Detecting user abort/navigation websockets 【发布时间】:2014-09-25 04:26:23 【问题描述】:

我正在尝试使用 websockets,并想检测用户是否已从页面导航到运行 php 流脚本。其他一切正常。

我所做的一切都不会阻止 PHP 脚本运行(在本地使用 Xampp)。

我目前正在使用 javascriptbeforeunload、PHP 的 connection_aborted()connection_status() 甚至 file_exists()(这是目前唯一可以使用的!!!)。 在脚本存在或我重新启动 apache 之前,我无法重新加载页面,但这是我必须开始工作的中止检测。 Firebug 报告套接字脚本已中止,但 PHP 只是保持 ion 运行。任何帮助表示赞赏。

我的 javascript 看起来像这样

function socket_open()
    if(!!window.EventSource)
        var websocket = new EventSource('./ajax/progress.php');
        websocket.addEventListener('message', function(e)
            var data = JSON.parse(e.data);
            console.log(data);
        ,false);
        $(window).bind('beforeunload', function()
            websocket.onclose = function();
            websocket.close();
        );
    

而我的 PHP 是这样的。 ./ajax/progress.php

function get_task_progress()
    $output = array();

    //conditionally create some output

    if(!empty($output))
        echo 'data: '.json_encode($output)."\n\n";
        ob_flush();
        flush();
    
    sleep(1);
    if(!connection_aborted() && connection_status()==0 && file_exists('1.txt'))
        get_task_progress();
    

【问题讨论】:

【参考方案1】:

我似乎已经解决了它,但在测试实时连接之前,每次请求都会回显并刷新无更新状态

if(!empty($output))
    $tasks_state = $tasks_new;
    echo 'data: '.json_encode($output)."\n\n";
else
    echo 'data: '.json_encode(array('e'=>0))."\n\n";


ob_flush();
flush();
sleep(1);
if(!connection_aborted() && connection_status()==0)
    get_task_progress();

【讨论】:

以上是关于检测用户中止/导航 websocket的主要内容,如果未能解决你的问题,请参考以下文章

Qt QNetworkAccessManager 中止身份验证

如何使用 UINavigationController 中的所有视图和导航控制器的导航控件检测用户活动?

Grails:在服务器端检测请求中止(ajax,escape,reload)

检测到错误后,Can Address Sanitizer会立即中止吗?

如何从外部窗口检测用户在 iframe 中导航到的 URL?

WPF,检测您正在从哪个选项卡导航