使用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:删除计划任务;
计划任务的周期时间表示: