这里也有相关回答 @PHP怎么写定时任务?,用到的函数 ignore_user_abort(),set_time_limit(0),sleep($interval)
此代码只要运行一次后关闭浏览器即可。
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*30;// 每隔半小时运行
do {
//这里是你要执行的代码
sleep($interval);// 等待5分钟
} while(true);
下面是我用上面的方法写的一个监控。
ini_set("error_reporting","E_ALL & ~E_NOTICE");
function_exists('date_default_timezone_set') && date_default_timezone_set('Etc/GMT-8');
$stime = date("n月j日 H:i:s");
//即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
ignore_user_abort();
// 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
set_time_limit(0);
// 每隔5分钟运行
$interval=60*5;
do{
/* 监控的网址 */
$host ='www.baidu.com';
/* 下面的是网站首页源代码中的一段特殊字符串 */
$find ='baidu';
if (!check($host,$find)){
alert($host);
}
file_put_contents('put.txt',' Current Time: '.$stime);
if( $stop == 500 ) break;
// 等待5分钟
sleep($interval);
}while(true);
function check($host,$find){
$fp =fsockopen($host, 80,$errno,$errstr, 10);
if (!$fp) {
echo "$errstr ($errno)n";
} else {
$header ="GET / HTTP/1.1rn";
$header .="Host: $hostrn";
$header .="Connection: closernrn";
fputs($fp,$header);
while (!feof($fp)) {
@$str .=fgets($fp, 1024);
}
fclose($fp);
return (strpos($str,$find) !== false);
}
}
function alert($host){
mail('admin@office.net','监控项目 [a] 故障通知','监控项目 [yaoinfo( '.$host.' )] 于 '.$stime.' 不可用(无法连接服务器)');
}
function alertok($host){
mail('admin@office.net','监控项目 [b] 可用(200 OK)','监控项目 [yaoinfo( '.$host.' )] 于 '.$stime.' 可用(200 OK)');
}