检测JQuery CDN是否宕机并处理它

8

明天我要发布自己的网站,预计会有几百个访问量。

我根据PHP.net上的指导编写了以下脚本:

<?
$f = fsockopen("code.jquery.com", 80, $errno, $errstr, 30); 
if(!$f){
echo '<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" type="text/javascript"></script>'; }
else {
echo '<script src="http://code.jquery.com/jquery-1.6.4.min.js" type="text/javascript"></script>'; }
?>

基本上,如果code.jquery.com的CDN出现故障(就像20分钟前一样),那么Google API库将会启动。我已经在jQuery正常运行时尝试过它,它确实可以工作,但以防再次出现问题,这个脚本真的能够工作吗?(通过切换到Google的库)我无法真正测试它,因为我必须让code.jquery.com离线。哈哈。
我可以进行CSS替换,但我的整个网站都基于jQuery和Ajax,所以我非常需要它始终正常运行。我可以将其托管在自己的网站上,但当code.jquery.com或googleapis.com正常运行时,我的网站速度远远不及它们。
非常感谢!任何回复都非常感激 :)

2
为什么不专门链接到googleapis.com?https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js应该会一直存在。 - Blazemonger
1
为什么更喜欢使用code.jquery.com而不是google?看起来google应该是你的首选。 - BNL
H@BNL 哈哈,个人偏好,我倾向于记住 code.jquery.com 的 URL,而忘记了 Google 的 URL:\ 谢谢你的评论,不过还是感谢 :) @mblase75 同样的原因 ^^ :P 尽管在阅读了你的评论之后,在这种情况下我可能会把 Google 放在第一位 - Karan
5个回答

25

为什么你要在服务器端这样做?这似乎更适合在客户端完成:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="http://code.jquery.com/jquery-1.6.4.min.js">\x3C/script>')</script>

这首先尝试从谷歌加载库。如果加载成功,则 window.jQuery 将可用。 如果不成功,则尝试从 code.jquery.com 加载。 你甚至可以在这两者之后放置另一个来加载本地版本,如果两者都无法加载:

<script>window.jQuery || document.write('<script src="my/js/jquery-1.6.4.min.js">\x3C/script>')</script>

+1 对于+1的实现:P 以及感谢您的回答!我没有意识到在JS中是可能的!感谢您的回答! :) - Karan
你好,我遇到了一些问题。code.jquery.com 看起来现在非常慢,这个脚本在等待很长时间(>20秒!)之后才会回退到本地版本。有没有办法设置一个阈值时间,在此之后“外部”请求被丢弃?在我看来,如果超过3秒没有响应,CDN 就不再值得使用了... - Vincent Pazeller
@Vincent Pazeller 您可以尝试使用setTimeout并检查jQuery全局是否可用。在这里看看:https://dev59.com/pXI-5IYBdhLWcg3wFkOO#2021325 - swatkins

11

或者您可以使用基本的HTML代码实现此功能:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.2.min.js"><\/script>')</script>

我不理解这个。请你能解释一下吗? - Mob
如果成功加载了jQuery,则window.jQuery将求值为true,否则将向文档写入以从次要来源加载jQuery。 - Mike

5

这样做不会有太大的好处。在每个请求中加入一个获取(fetch)操作会大大降低速度。此外,如果您有上游缓存,更改也不会反映出来。

我会选择完全使用JavaScript解决方案:尝试加载其中一个,如果不起作用,请尝试另一个。


5
不仅如此,仅仅因为自己的服务器可以/无法访问另一个服务器,并不能告诉你客户端是否能够访问该服务器。 - Pointy
直到大约一分钟前我还不知道在JavaScript中也可以这样,哈哈,我刚才从另一个人的回答中意识到,在第一次成功获取后立即测试jQuery就可以很好地解决问题!感谢您的回答! - Karan

2
我相信这样做可以正常工作,但会给每个发送到服务器的请求增加很多额外负担。
使用JavaScript在客户端完成此操作。
<script src=http://code.jquery.com/jquery-1.6.4.min.js"></script>
 <script>window.jQuery || document.write('<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js">\x3C/script>')</script>

0

你可以通过在主机文件中(Linux上的/etc/hosts,Windows上的windows\system32\drivers\etc\hosts)添加一个指向code.jquery.com的条目来进行测试(在本地/测试服务器上),例如,指向一个在你的网络上未使用的本地IP。系统会暂时将其视为code-jquery.com的DNS,并且不会从那里获取响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接