php 进程守护

进来发现我每次群发邮件都要跑到服务器折腾一番,守护php的任务,也可以用linux自带的crontab来实现。

但是服务器上这玩意太多了。所以简单开发一个纯php来实现的办法

功能1. 当有任务的时候,执行任务
功能2. 当没有任务时候,自己sleep,每隔一定时间(代码里2秒)扫描任务文件auto.lock,判定是否需要执行任务。如果文件内容为1那么执行任务,如果为0,那么接着睡觉

还可以开发
1. 任务中断,需要改动runonce的代码,在执行过程打断,月小升觉得没必要,我不需要在群发邮件的时候中断
2. 多个任务管理 搞得更复杂了。除非有很多任务要被php管理,否则拷贝一个php 来的方便些。

linux 一次启动,就不管了。

nohup php auto.php &

auto.php 源码

<?php
ini_set('max_execution_time', 0); //300 seconds = 5 minutes
if(function_exists('date_default_timezone_set')) {
    date_default_timezone_set('PRC');
}
watch();
//守护函数,遇到锁开就执行,集中精力在这个函数上。
function watch(){
	$dir = __DIR__;
	$f = $dir."/Public/auto.lock";
	$sleepTime = 3;
	while(true){
		$lock = intval(file_get_contents($f));
		$time = strftime( "%Y-%m-%d %H:%M:%S" ,time());
		if($lock==1){
			echo $time." Start job \n";
			//runOnce();
			writeover($f,'3');//群发结束通知下
			echo $time." Job finished. \n";
		}else{
			echo $time." : watch every $sleepTime s\n";
		}
		sleep($sleepTime);//秒,决定几秒扫描一次锁
	}
}
 
 
//执行一次任务
function runOnce(){
	$url = "https://java-er.com/sendmail";
	while(true){
		$time = strftime( "%Y-%m-%d %H:%M:%S" ,time());
		echo $time." Running \n"; 
		$content = down($url);
		$k = 0;
		if(checkstr($content,'Your account is on probation')==true){
			echo "Error sleep 10 minutes \n";
			sleep(60*5);//10 minutes
			$k = 1;//如果没有禁止那么$k=0
		}
 
		if(checkstr($content,'setTimeout')==true){
			echo "OK go on";
			$k = 1;
		}
		if($content==''){//说明下载失败了。多等一会,服务器可能扛不住了。2020.04.05
			$k = 1;
			sleep(60*5);//5 minutes
		}
 
		if($k==0)return;// 说明跑完毕了。2020.04.22 以前是直接exit现在改成return,退出函数
 
		sleep(10);//10 second
	}
}
 
//下载url
function down($filename){
	$handle = fopen($filename, "r"); 
	$contents = ""; 
	do { 
		$data = fread($handle, 8192); 
		if (strlen($data) == 0) { 
			break; 
		} 
		$contents .= $data; 
	} while(true); 
	fclose($handle); 	
	return $contents;
}
 
//小函数判断是否包涵 $needle = "a";//判断是否包含a这个字符
function checkstr($str,$needle){
	$tmparray = explode($needle,$str);
	if(count($tmparray)>1){
		return true;
	} else{
		return false;
	}
}
 
/*
‘r’ 只读方式打开,将文件指针指向文件头。
‘r+’ 读写方式打开,将文件指针指向文件头。
‘w’ 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’ 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
 
LOCK_SH取得共享锁定(读取的程序)。
LOCK_EX 取得独占锁定(写入的程序。
LOCK_UN 释放锁定(无论共享或独占)。
*/
function writeover($filename,$data,$method="rb+",$iflock=1) 
{ 
    @touch($filename);/*文件不存在则创建之.可以采用file_exists验证并其他创建文件函数代替.测试结果效率相当*/ 
    $handle=@fopen($filename,$method); 
    if($iflock){ 
        flock($handle,LOCK_EX); 
    } 
    fwrite($handle,$data); 
    if($method=="rb+") ftruncate($handle,strlen($data)); 
    fclose($handle); 
}
 
 
?>

执行效果

# php auto.php 
2020-04-22 18:10:44 : watch every 3 s
2020-04-22 18:10:47 : watch every 3 s
2020-04-22 18:10:50 : watch every 3 s
2020-04-22 18:10:53 : watch every 3 s
2020-04-22 18:10:56 : watch every 3 s
2020-04-22 18:10:59 : watch every 3 s
2020-04-22 18:11:02 : watch every 3 s
2020-04-22 18:11:05 : watch every 3 s
2020-04-22 18:11:08 : watch every 3 s
2020-04-22 18:11:11 : watch every 3 s
2020-04-22 18:11:14 : watch every 3 s
2020-04-22 18:11:17 : watch every 3 s
2020-04-22 18:11:20 : watch every 3 s
2020-04-22 18:11:23 : watch every 3 s
2020-04-22 18:11:26 : watch every 3 s
2020-04-22 18:11:29 : watch every 3 s
2020-04-22 18:11:32 Start job 
2020-04-22 18:11:32 Job finished. 
2020-04-22 18:11:35 : watch every 3 s
2020-04-22 18:11:38 : watch every 3 s


This entry was posted in Linux, PHP and tagged , , . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/php-process-watch/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.
2020.03.24 评论已经全局关闭,有事加QQ聊天