如果Google Analytics(分析)发生故障,我该如何保持网站正常运行?

时间:2013-01-19 10:16:57

标签: javascript jquery ajax asynchronous google-analytics

好的,它是2013年1月19日22:30 NZST和大多数互联网似乎已经爬行,因为Google Analytics似乎运行速度非常慢。 Stackoverflow,Firefox.com,reddit和谷歌搜索都很慢。对我来说最重要的是,我的生产企业网站运行缓慢或根本没有加载。不,这不只是我的连接,我也在手机上测试了3G。没有Google Analytics的网站似乎运行良好。

以下是发生了什么的截图

这位于Firefox窗口的左下角。它将在那里停留20多秒。如果它无法连接,我希望它在3秒后消失。

enter image description here

这个旋转的绿色图像位于Firefox选项卡中,只是坐在那里使它看起来像页面仍然加载20秒以上。如果它无法连接,我希望它在3秒后消失。

enter image description here

现在它可能不是谷歌分析,我的国家'国际网关可能运行缓慢或其他东西。但有证据表明它可能是谷歌分析。现在,即使它不是谷歌分析,那么如果服务完全失效,我仍然会对某些方法感兴趣。所以假设我们假设Google Analytics数据中心发生大火并且灭火系统失败了。现在Google Analytics几天完全脱机了。没有备份服务器。没有备用数据中心。假设情景确定。现在我的网站仍然需要运行,因为我无法让我的网站依赖Google Analytics服务。但如果服务实际上及时运行,分析功能可以作为额外的奖励。

好的,我在这里抛出一些想法:

  1. 我可以添加到我的脚本中的超时是否会取消与Google Analytics的连接并停止请求/下载如果耗时太长?然后它会在2秒后继续加载我的网站。
  2. 或者更好的是,也许它可以完全加载我的网站,然后在我的网站完全加载后使用Ajax向Google Analytics发送请求?为什么默认不这样做?
  3. 以下是我们必须使用的代码,该代码当前在结束</body>代码之前插入。

    <script type="text/javascript">
        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', 'UA-123456789-1']);
        _gaq.push(['_trackPageview']);
        (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        })();
    </script>
    

    现在,我可以采用哪些方法来修复这个假设的灾难情景,并在Google Analytics停机时让我的网站保持连续性?我对潜在的软件或硬件解决方案感兴趣。假设我可以完全访问运行PHP / MySQL / HTML5网站的Linux VPS。

    此外,对此的权威答案是什么:有人说将代码放在结束</head>标记之前。其他人说把它放在收尾</body>标签之前。哪种方式最好?

    非常感谢

    解决方案更新

    好的,我发现了什么在Jaspal的帮助下有效。解决方案如下。

    <script type="text/javascript">
        // Load Google Analytics after my site has completely loaded
        // Then when Google Analytics request is made it won't show any visuals in the browser
        setTimeout(loadGoogleAnalytics, 5000);
    
        // Setup _gaq array as global so that the code in the ga.js file can access it
        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', 'UA-123456789-1']);
        _gaq.push(['_trackPageview']);
    
        /**
         * Loads Google Analytics
         */
        function loadGoogleAnalytics()
        {
            var srcUrl = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    
            $.ajax(
            {
                url: srcUrl,
                cache: true,
                dataType: "script",
                success: function(data)
                {
                    console.log('got the script');
                },
                error: function()
                {
                    console.log('failed to get the script');
                },
                timeout: 5000
            });
        };
    </script>
    

    基本上它的工作原理是因为setTimeout持续5秒。这使我的页面有足够的时间加载所有内容,JS,CSS,图像等。之后,它启动$ .ajax请求并下载实际将数据发送到Google Analytics的ga.js和__utm.gif。在最初的5秒之后,基本上我之前提到的所有浏览器视觉效果都消失了,Google Analytics请求在后台静默发生,没有为浏览器用户加载视觉效果。然后我尝试使用主机文件阻止Google Analytics,但我仍然没有获得任何浏览器视觉效果 - 完美。

    应该注意$.ajax请求中的timeout: 5000属性似乎没有做任何事情。最初我希望它会中止请求,如果它无法获取数据5秒,但API文档中有一条说明

      

    仅在Firefox 3.0+中,无法取消脚本和JSONP请求   超时;即使超时后到达,脚本也会运行   周期。

    我会留在那里,以防万一。根据我的测试,如果无法访问Google Analytics(通过观察Firebug / Chrome中的网络/网络面板),那么它将在Firefox中以21-23秒后退出请求,在Chrome中退出16秒。这可能是一些TCP超时。我并不担心,因为它会默默地超时,用户不会注意到,因为浏览器中没有加载视觉效果。

    我接受了Jaspal在下面的回答,并给了他赏金,因为他的解决方案对解决这个问题至关重要。但是他的解决方案仍然在浏览器中显示加载的视觉效果。所以我相信使用setTimeout在这里发布的解决方案(对他原来的一个稍作修改)是要走的路,经过测试对我来说是100%工作。

4 个答案:

答案 0 :(得分:11)

考虑到加载的位置,您的网站其余部分会在向Google Analytics提出请求之前加载。加GA是异步加载的,不会停止执行任何代码,所以我真的没有看到问题。

答案 1 :(得分:6)

最新方法:

  1. 我们允许ga正常加载。
  2. 我们在全局变量(gaClone)中存储对ga dom元素的引用。
  3. 我们将超时设置为30秒。我们还设置了另一个全局变量(loadedGoogleAnalytics)并将其初始设置为0。当ga加载时,我们将此变量设置为1.在超时到期时,我们检查ga是否已加载。如果没有,我们删除dom元素ga。

    <script type="text/javascript">
        var loadedGoogleAnalytics = 0;
        var gaClone;
        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', 'UA-123456789-1']);
        _gaq.push(['_trackPageview']);
    
        _gaq.push(function() {
            loadedGoogleAnalytics = 1;
            //console.log('GA Actualy executed!');
        });
    
        (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    
            gaClone = ga;
    
        })();
    
        setTimeout(function() {
            //console.log('timeout fired');
            if (loadedGoogleAnalytics != 1) {
                gaClone.parentNode.removeChild(gaClone); 
            }
        }, 30000);
    </script>
    
  4. [我已经通过我的一个实际GA帐户验证了此方法,并且我能够看到所有实时跟踪]

    以前的方法 [注意:如果我们尝试将其放入(文档).ready();中,则Ga不会执行 [此解决方案不起作用]

    <script type="text/javascript">
        $(document).ready(function() {
                var _gaq = _gaq || [];
                _gaq.push(['_setAccount', 'UA-123456789-1']);
                _gaq.push(['_trackPageview']);
    
                srcUrl = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    
                $.ajax({
                    url: srcUrl,
                    cache: true,
                    dataType: "script",
                    success: function(data) {
                        //console.log('got the script');
                    },
                    error: function() {
                        //console.log('failed to get the script');
                    },
                    timeout: 30000
                });
            });
    </script>
    

    希望这有帮助

答案 2 :(得分:0)

您可以在自己的服务器上托管www.google-analytics.com/ga.js的副本,然后从那里加载它。如果你确实走了那条路,我会设置一个cron作业来定期获取ga.js,以确保你有最新的版本。

关于跟踪代码展示位置:在页面中(</head>之前)放置跟踪代码的主要原因之一是与快速离开页面的访问者(可能在整个页面呈现之前)有关。在这种情况下,您越有可能在跟踪代码执行后越早收集一些数据。

答案 3 :(得分:-1)

尝试修复未破坏的内容

如果您想使用Google分析,您需要与服务器进行一些沟通,如何,期间。正如许多其他答案所指出的那样,服务运行异步意味着它不会阻止您的网站运行。 “加载视觉效果”可以显示正在加载的东西......你可以做的很少。

你有两种选择;忍受谷歌分析或使用一些服务器端脚本来运行分析。

如果网站挂起,则是因为其他原因。

修改

同样不包括GA也会降低统计数据的准确性;特别是跳出率不正确。