为什么我的ShardWorker不是在Firefox中运行,而是在Google Chrome中运行



我最终实现了在共享Worker中运行服务器发送的事件SSE。这个实现允许我将服务器上运行的脚本总数限制为每个用户一个。

然而,我仍然有几个问题。

  1. SharedWorker不能在FireFox中运行,但可以在Google Chrome中运行。我用的是火狐v40.0。我在控制台中没有得到任何错误。我确实在控制台中看到关于SSL证书的警告,但没有错误。下面是来自FireFox控制台
  2. 的警告

该站点使用SHA-1证书;建议您使用具有使用哈希函数的签名算法的证书比SHA-1更强。(了解更多)

  • 看起来ShardWorker在空闲一段时间后停止工作。这不是PHP脚本问题,因为脚本工作文件没有共享worker。我在Chrome v44.0中遇到了这个问题。如果要让shardworker重新启动,我必须重新加载页面。
  • 我能做些什么来找出什么可能导致ShardWorker停止?为什么SharedWorder不在FireFox中运行?

    这是我的实现

    这是调用SharedWorker

    的代码
    $(window).load(function(){
        //establish connection to the shared worker
        var worker = new SharedWorker("/add-ons/icws/js/worker.js");
        //listen for a message send from the worker
        worker.port.addEventListener("message",
            function(event) {
                console.log(event.data);
                processServerData(event.data);
            }
            , false
        );
        //start the connection to the shared worker
        worker.port.start();
    });
    
    以下是worker.js 的代码
    var clients = new Array();
    //runs only when a new connection starts
    self.onconnect = function(event) {
        var port = event.ports[0];
        clients.push(port);
        port.start();
        //implement a channel for a communication between the connecter and the SharedWorker
        port.addEventListener("message",
            function(event) { 
                replyToClientMessage(event, port);
            } , false
        );
    }
    //reply to any message sent to the SharedWorker with the same message but add the phrase "SharedWorker Said: " to it
    replyToClientMessage = function (event, port) {
        port.postMessage(event.data);
    }
    readNewMessages();
    //runs every time and post the message to all the connected client
     function readNewMessages(){
        var serv = new EventSource('/add-ons/icws/poll.php');
            serv.addEventListener("getMessagingQueue", function(event) {
            var queue = JSON.parse(event.data);
            notifyAllPorts(queue);
        }, false);
    }
    //check all open clients and post a message to each
     function notifyAllPorts(msg){
        var len = clients.length;
        var port;
        for(i = 0; i < len; i++) {
            port = clients[i];
            port.postMessage(msg);
        }
    }
    

    这不可能。EventSourcewindow对象的属性。windowWorker不可用。参见worker可用的功能

    worker不能访问:

    • DOM(它不是线程安全的)
    • 窗口对象
    • 文件对象
    • 父对象

    最新更新