执行 cURL 请求以检查网站是否存在/在线
技术 #1
<?php
if (isDomainAvailible('https://css-tricks.cn'))
{
echo "Up and running!";
}
else
{
echo "Woops, nothing found there.";
}
//returns true, if domain is availible, false if not
function isDomainAvailible($domain)
{
//check, if a valid url is provided
if(!filter_var($domain, FILTER_VALIDATE_URL))
{
return false;
}
//initialize curl
$curlInit = curl_init($domain);
curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curlInit,CURLOPT_HEADER,true);
curl_setopt($curlInit,CURLOPT_NOBODY,true);
curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);
//get answer
$response = curl_exec($curlInit);
curl_close($curlInit);
if ($response) return true;
return false;
}
?>
技术 #2
<?php
function Visit($url){
$agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";$ch=curl_init();
curl_setopt ($ch, CURLOPT_URL,$url );
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch,CURLOPT_VERBOSE,false);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch,CURLOPT_SSLVERSION,3);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, FALSE);
$page=curl_exec($ch);
//echo curl_error($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode>=200 && $httpcode<300) return true;
else return false;
}
if (Visit("http://www.google.com"))
echo "Website OK"."n";
else
echo "Website DOWN";
?>
技术 #3
<?php
ini_set("default_socket_timeout","05");
set_time_limit(5);
$f=fopen("https://css-tricks.cn","r");
$r=fread($f,1000);
fclose($f);
if(strlen($r)>1) {
echo("<span class='online'>Online</span>");
}
else {
echo("<span class='offline'>Offline</span>");
}
?>
在技术 #2 中,应该写成
... && $httpcode<400) return true;
而不是
... && $httpcode<300) return true;
否则,重定向将被视为“服务器宕机”。
您好 NetHawk。
我测试了一下,您完全正确。$httpcode<300 总是返回服务器宕机。
无论如何,我做了一点修改,这样我就可以测试几个网站了,但有时,网站会随机显示为宕机,如果您能帮我,请问可能是什么问题?我尝试为 cron 作业这样做。
代码
=200 && $httpcode”.$sitio.””;
else
echo “DOWN->”.$sitio.””;
}
?>
看起来代码被截断了……无论如何,我做的唯一修改是将 URL 放入数组中,然后在 foreach 循环中逐个测试它们。
这里有一个替代方法:http://www.softwaregeneration.org/downforeveryoneorjustme
如何使用它?????????
方法是什么
将示例 #2 中的代码复制到文本文件中。为其提供 .php 扩展名。将文件移到您的 Web 服务器,然后调用指向该文件的 URL。如果您拥有启用 PHP 的服务器(大多数服务器都是如此),代码将检查 Google 是否正常运行(可能总是正常运行)。
您可以从这里开始,但您需要一些基本的 PHP 知识。
哪种技术更适合使用?优势?劣势?
#1 检查 URL 是否有效,这是一个巨大的优势,如果 URL 由用户输入,而不是来自数据库或来自已知有效的 URL 列表。
另一方面,#2 提交用户代理字符串。没有它,一些服务器会用错误 403(禁止)或 405(方法不允许)来响应请求。
结论:我建议使用 #2,但要进行 #1 的过滤器测试。
实际上,Chris 应该对此说些什么,因为他正在运营 aremysitesup.com,这是一项可能使用这种技术的服务(参见此页面页脚中的按钮 - 非常棒的服务,强烈推荐)。
我们实际上使用 Ruby 和一些更复杂的方法 =)。但原理是一样的。
谢谢!我想知道 http://www.checksite.us 是否使用相同的方法?
另外,代理的目的是什么?
Checksite.us 可能基于类似的机制,尽管不清楚使用了哪种语言。
UserAgent 是任何浏览器发送的用来识别自己的字符串。至少,这是最初的目的。如今,许多浏览器会对细节撒谎。但是,只要发送了 UserAgent,Web 服务器通常会将请求视为合法请求。此外,机器人(例如 Google)也拥有 UserAgent 字符串来识别它们。
如果没有发送 UserAgent 字符串,一些 Web 服务器出于某种原因不允许您访问该网站(他们可能不喜欢其他工具或服务器直接访问其页面)。
您可以在此页面上查看浏览器的 UserAgent 字符串(以及其他信息)
http://browser.delucamarketing.ch/
他们使用 php,我认为代码与示例类似,但有一些变化,他们的表单中不需要 http,而此网站上的示例需要,但添加一个能够剥离或添加 http:// 或其他部分的函数很容易,例如,如果您不想允许检查子域,例如 alexa.com 正在替换 URL 的部分...
checksite.us 有一个 index.php 文件,所以它正在使用 php,99% 确定:http://www.checksite.us/index.php?url=www.awesomehosting.nl 我有脚本可以显示有关网站的信息,并提取它们服务器发送的信息...
谢谢分享!
这些技术似乎都不起作用……每次我检查类似 http://www.adfsfdasffsfasfsf.com 的东西时,它总是返回 200……有谁知道如何确定一个网站是否不可用,例如 *咳咳* *咳咳* godaddy *咳咳* *咳咳*
这是一个简单的 whois 查询。您需要在端口 43 上创建套接字连接。这只是让 PHP 连接到您在执行 whois 查询时终端使用的同一个 whois 服务器。
这是一个简单的 whois 查询。您需要在端口 43 上创建套接字连接。这只是让 PHP 连接到您在执行 whois 查询时终端使用的同一个 whois 服务器。
抱歉,出于某种原因,代码没有显示出来,您可以在 http://www.phptoys.com/e107_plugins/content/content.php?content.38 上找到一个不错的教程,其中详细介绍了如何构建一个。
还有一个使用套接字的解决方案
http://neo22s.com/check-if-url-exists-and-is-online-php/
您好 Chris,
您知道如何检查一堆 URL 是否有效吗?例如。我需要对 1000 个 Twitter 个人资料进行检查,我需要知道它们是活动页面还是无效 URL。我希望能够粘贴整个 Twitter URL 列表并检查它们是否为有效的页面。
不错,
但 who.is 有任何 API 可以检查吗?我认为使用 Web 服务将更有效地帮助实现目标。就像我在获取 Alexa 排名时所做的那样,
http://tutology.net/category/how-php/get-alexa-rank-php-and-alexa-api
很棒的概念
在我看来,如果存在重定向,这些脚本实际上不会起作用。因此,“facebook.com”和“www.facebook.com”可能会返回不同的结果,即使该网站正常运行。
是吗?
有谁知道“downforeveryoneorjustme.com”是怎么做到的?那个脚本似乎每次都能正常运行,无论是否存在重定向……
这些代码并不完美。我在 isitdownrightnow.com 上尝试了不同的域名,脚本在某些域名上失败了。 ask.com 就是一个例子。
http://www.downforeveryoneorjustme.com/ask.com
但是它在 Doj.me 上有效。 不确定他们使用的是什么方法…
http://doj.me/?url=ask.com
你好,
感谢你的教程。不过,我想问一下,你怎么确定不是你的网络连接断开了?
非常感谢。
在这种情况下,你甚至无法连接到服务器来运行脚本:)
你好
这些脚本都不适合我!
我试图让脚本告诉我我的服务器是否在线。我没有域名,所以我使用的是 IP(有时还有端口)。
当我输入我的服务器的 IP 时,它说它在线。
此外,当我关闭服务器时,它仍然说它在线…
我该如何解决这个问题?有什么想法吗?
– Mystic
这是一种好方法,这里也发布了非常类似的方法:http://geeks-wiki.blogspot.com/2012/10/how-to-check-if-url-is-up.html,我认为这种方法类似但有效。
最好的,
Patrick
谢谢
这是一个非常有用的技巧 #2
它解决了我的问题,一次检查了 500 个 URL
太难了 :D 谢谢
我遇到了这种情况,URL 重定向到另一个已失效的 URL。我该如何检查这种错误?
我开始使用技巧 1,但有些链接报告不正确,所以我添加了技巧 2,组合似乎工作正常
“Availible” 不是一个词。
它是一个词
Grammar Police,这是一个错误的逮捕!“Availible”不是语法错误,所以你没有管辖权。
Typo Police,放松;Spelling Police,逮捕那个罪犯,马上!
给出的脚本非常有用,我一直在寻找这样的脚本来检查网站是否正常运行,但是如果可以添加更多内容,那就太好了。有些网站是正常的,但被停用了,有没有办法检查它们是否在服务器上正确托管而不是被停用?
嗯.. 以上方法都不适合我?也就是说
1. 和 2. 方法总是返回 true,而第 3 种方法则抛出像 baws 这样的错误
编辑:2. 方法有效,但对我来说是反转的(ture -> DOWN,false -> UP)... 不要问我为什么
嗨,各位..
我认为,只需要使用这个..
http://www.phpservermonitor.org/
这只能告诉你服务器是否正常运行。
但不能真正判断网站是否已关闭、暂停、500 错误等
我看到很多人在这里遇到了问题。
请确保,如果你使用示例二,请查看 NetHawk 的评论,了解如何将 200<=$httpcode<400。
此外,使用小写字母作为第一个字母来声明函数是一种良好的做法。
对 CSS Tricks 的爱在这里。
Curtis
我有一个表单,需要获取网站。我们需要检查网站是否有效。我应该将代码嵌入到哪里?也就是说,在 #1 中,需要手动输入 URL。但我需要它自动完成。我该怎么做?
我测试过了,你完全正确。但我有疑问。这些脚本用于一个域名。但是,我需要知道 50 个域名是否同时正常运行。
请回复
嗨,
首先,感谢您的脚本。它们非常有用。
我最近在一个网站上使用了你的脚本 #1 来检查一个已知的 JSON 源是否可用,如果不可用,则切换到备份。我没有将 300 响应更改为 400,如上所述,因为这两个网站都是我已知的并由我控制,所以不会重定向。
几天前我遇到的问题是 AWS 服务器挂起。我发现,由于此脚本使用 CURLOPT_CONNECTTIMEOUT,连接已建立,但脚本只是保持打开状态等待响应。随着网站打开的页面越来越多,它填满了 PHP 内存,网站最终崩溃。我一关闭 AWS 服务器,脚本就按照预期处理了响应。
在此之后,我一直寻找解决服务器挂起问题的办法。我有一个基于你的脚本 #2 的测试页面(由于某种原因,#1 在该网站上不起作用)。我刚刚添加了下面的中间行:–
$agent = “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)”;$ch=curl_init();
curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT_MS,500);
curl_setopt ($ch, CURLOPT_URL,$url );
在 $ch 行中使用 $curlInit 正确吗?
对于脚本 #1,我可以添加
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 2000);
还是应该改为:–
curl_setopt($curlInit, CURLOPT_TIMEOUT_MS, 2000);
最后,我可以通过在 EC2 控制台中关闭服务器来轻松测试服务器是否已关闭,但您是否知道如何测试服务器挂起时会发生什么?是否有我可以尝试连接的“挂起”服务器,以便进行测试?
抱歉,问了这么多问题,而我的知识却如此匮乏!
你可以使用在线替代方法 >>>>https://downforeveryoneorjust.me/ 来检查