我需要创建一个PHP脚本,该脚本可以成功地检查网站是否当前在线/仍然处于活动状态。
我有一个大约3000个网站的列表要检查,我想设置一个CRON作业,每天运行脚本,以确保网站仍然活跃。
我做了一些研究,并用这个例子构建了一些东西:
<?php
if (isDomainAvailible('http://www.css-tricks.com'))
{
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;
}
?>
但它总是在300次左右的检查后超时,因为我知道这可能是PHP执行问题,我想知道是否有更好或更快的方法来检查这些网站。
如果allow_url_fopen指令为On:,也可以使用fopen()等函数
$handle = fopen("http://www.example.com/", "r");
或stream_context_create():
$opts = array('http' => array(
'method'=>"GET",
));
$context = stream_context_create($opts);
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
假设链接存储在数据库中,您可以在数据库表DATE字段中添加,例如"last_check"和检查后更新日期。
但每个站点5秒,乘以3000多个站点意味着250分钟,我认为这不是一个可行的解决方案SNpn
SQL查询应选择"last_check",其中"last_ceck"不等于当前日期。每个查询最多只能有10个结果。
将您的cron设置为每分钟运行php脚本,从午夜到早上6点。
* 0-6 * * * * PATH/TO/YOUR/PHP/SCRIPT