进来发现我每次群发邮件都要跑到服务器折腾一番,守护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