PHP定时任务

使用js的settimeout+php的sleep死循环

多任务定时:
任务脚本timedTask.php:
三个任务方法必须单独声明,不能用封装在一起,程序的顺序执行会影响彼此的睡眠时间;

<?php 

/**
任务方法和接收请求开启任务的方法均单独声明,避免程序的顺序执行对彼此造成的影响
*/
/**
* Created by PhpStorm.
* User: zhangjian_java
* Date: 2016/10/27
* Time: 10:11
*/
/**
* 具体任务
*/
function write_dateTxt(filepath)   
    {   
     //无论浏览器是否关闭,下面的代码都将执行   
     ignore_user_abort(true);   
     //取消php文件的执行时间,默认为30秒   
     set_time_limit(0);   
     //判断文件是否存在   
     if (!file_exists(
filepath)) {
//获取与文件的连接对象
fconn=fopen( filepath);
fclose(fconn);   
     }
content = file_get_contents( filepath);// content .= “\r\n时间戳:” . date(“y-m-d h:i:s”, time());
//获取输入流
finputStream=fopen( filepath, “wb”);
//执行写入
fwrite( finputStream, content);
//关闭流
fclose($finputStream);
}
/**
* 任务一
*/
function do_interval_one(){

 while (1) { 
 //将参数的读取加入到while循环中,保证实时读取配置文件的参数,做到实时控制 
 //放到while之上就不能实时加载读取配置文件中的配置参数,而会一直使用第一个读取到的参数(将其存到内存中作为局部变量)不能做到实时控制; 
 $param_arr = include "timedTaskConfig.php"; 
 //任务时间周期 
 $interval_time_one = $param_arr['interval_time_one']; 
 //输出文件路径 
 $filepath_one = $param_arr['filepath_one']; 
 //执行开关 
 $flag_one = $param_arr['flag_one']; 
 if ($flag_one) { 
 usleep($interval_time_one); 

 write_dateTxt($filepath_one); 
 } else { 
 die('process abort'); 
 break; 
 } 
 session_write_close(); 
 } 
} 

/** 
 * 任务二 
 */ 
function do_interval_two(){ 

 while (1) { 
 $param_arr = include "timedTaskConfig.php"; 
 //任务时间周期 
 $interval_time_two = $param_arr['interval_time_two']; 
 //输出文件路径 
 $filepath_two = $param_arr['filepath_two']; 
 //执行开关 
 $flag_two = $param_arr['flag_two']; 
 if ($flag_two) { 
 usleep($interval_time_two); 
 write_dateTxt($filepath_two); 
 } else { 
 die('process abort'); 
 break; 
 } 
 session_write_close(); 
 } 
} 

/** 
 * 任务三 
 */ 
function do_interval_three(){ 

 while (1) { 
 $param_arr = include "timedTaskConfig.php"; 
 //任务时间周期 
 $interval_time_three = $param_arr['interval_time_three']; 
 //输出文件路径 
 $filepath_three = $param_arr['filepath_three']; 
 //执行开关 
 $flag_three = $param_arr['flag_three']; 
 if ($flag_three) { 
 usleep($interval_time_three); 
 write_dateTxt($filepath_three); 
 } else { 
 die('process abort'); 
 break; 
 } 
 session_write_close(); 
 } 

任务配置文件timedTaskConfig.php:
实时更改配置文件的参数,即可控制任务的执行;
注:执行开关是单向控制的,手动1->0时可以停止任务,手动0->1时不能再启动任务;重启任务需手动0->1后再触发任务方可在重启;

<?php 
/** 
 * Created by PhpStorm. 
 * User: zhangjian_java 
 * Date: 2016/10/31 
 * Time: 17:19 
 */ 
return array( 
 //执行开关 
 'flag_one'=>1, 
 'flag_two'=>1, 
 'flag_three'=>1, 
 //文件输出目录 
 'filepath_one'=>'C://zhangjian_dingshirenwu/zhang1.txt', 
 'filepath_two'=>'C://zhangjian_dingshirenwu/zhang2.txt', 
 'filepath_three'=>'C://zhangjian_dingshirenwu/zhang3.txt', 
 //超时时间 单位微秒 
 'interval_time_one'=>2000000, 
 'interval_time_two'=>3000000, 
 'interval_time_three'=>1000000, 
 ); 
  • 在Config/config.php中添加Common下新增的xxx.php的方法签名,启动服务器apache时会读取加载conf.php中的声明的文件;

控制器中编写处理多个任务请求的方法:
三个方法必须分别声明,保证多个任务请求同时到达,避免程序的顺序执行造成彼此的影响;
如果合并在一个方法里,永远执行不到第一个任务之后的任务,php是单线程的,该线程会在第一个任务的while死循环中出不来;

<?php 
namespace Admin\Controller; 

use Common\Controller\AuthController; 
use Think\Db; 

header("Content-type: text/html; charset=utf-8"); 

class SksbglController extends AuthController 
{ 
 /** 
 * 任务一 
 */ 
 public function taskOne() 
 { 
 doTaskOne(); 
 } 

 /** 
 * 任务二 
 */ 
 public function taskTwo() 
 { 
 doTaskTwo(); 
 } 

 public function taskThree() 
 { 
 doTaskThree(); 
 } 
} 

前端页面js发送正常业务请求之前先发送三个任务请求:

 /** 
 * 报税盘信息查询 
 */ 
 function bspxxcx() { 
 if (validateBspkl()) { 
 setTimeout(function () { 
 $.ajax({ 
 async: true, 
 type: 'POST', 
 url: "{:U('taskOne')}", 
 success: function () { 
 }, 
 error: function () { 
 } 
 }); 
 },5); 
 setTimeout(function () { 
 $.ajax({ 
 async: true, 
 type: 'POST', 
 url: "{:U('taskTwo')}", 
 success: function () { 
 }, 
 error: function () { 
 } 
 }); 
 },5); 
 setTimeout(function () { 
 $.ajax({ 
 async: true, 
 type: 'POST', 
 url: "{:U('taskThree')}", 
 success: function () { 
 }, 
 error: function () { 
 } 
 }); 
 },5); 
 setTimeout(function(){ 
 $("#bf").submit(); 
 }); 
 } 
 } 

2

windows的计划任务

新建.bat文件,里面:
(本地windows的php执行器路径 -q 要定时执行的php脚本文件路径)
C:\xampp\php\php.exe -q C:\zj_image\Quarz.php
然后在windows的开始中搜索计划任务,
设置定时执行时间,设置要执行的bat脚本,设置执行时机(即脚本的触发时机);
这种方式是让windows操作系统定时执行bat脚本,然后bat脚本里执行指定的php脚本文件;
触发时机为手动执行该bat文件或设置windows在特定时机(如开机)执行该.bat文件;

linux的定时工具

========================

crontab 周期性计划任务

========================

1,首先确保系统的crond服务是开启的,查看系统crond服务是否开启:service crond status
功能:周期性执行计划任务
用法:crontab [-u] [-l || -e || -r]

参数:-u:指定登录系统的当前用户,如果不指定默认为root用户;
-l: 列出计划任务;
-e: 制定计划任务;
-c:删除计划任务;
计划任务的周期时间表示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值