php虚拟主机下实现定时任务(仅供参考)

因为要做简单的中控  在实现心跳包的时候遇到了困难 正常的心跳包思路是这样的  举个例子 我写一个登陆签到脚本   当我登陆成功的时候 会把登陆成功这个状态传递给网络上的中控端 当我签到完成的时候会把签到成功的脚本状态传递给网络上的中控端 这样 我们在中控那边就可以清晰的看到当前脚本运行到哪个部分 如果脚本停止 以安卓按键为准会触发一个  OnScriptExit 事件  我们只需要在这个事件里面写上代码  当触发这个事件的时候 我们就给中控端发送下脚本状态为close 或者stop的状态信息 中控端就可以清楚脚本当前具体是处于什么状态 但是这个只是理想化状态   因为 有的时候脚本未必是正常关闭的 这样会导致 在中控端 因为迟迟收不到脚本的最新消息  当前脚本状态无法变化  看起来还在运行 但是实际上已经脚本崩溃导致问题,后来想到了心跳包  就是多开1个线程 间隔一会就向中控端发送信息 来让中控端知道 我这个脚本还在运行 如果超出一定时间内 中控端再也没接收到这个脚本的心跳包 那么中控端就会判定该脚本已经关闭

要解决的问题:从实际上来说 我们中控端有一个额外的操作 就是 间隔一定的时间 就搜索下数据库里面 所有的脚本记录 看看每个记录的最新记录时间和当前时间 相差多少 如果相差太多 就直接让这个记录对应的脚本状态设置了close或者stop  保证应对脚本异常关闭的情况 这也是这个文章的主要要解决的问题

思路:因为是虚拟主机 不是真正的主机 如果是真正的主机 那么可以考虑的办法相当的多 也无需像我这样费尽心机 比如可以用主机系统的计划任务来定时执行某些数据库操作 也可以用mysql的超级管理员的一些功能来实现定时任务  。百度了下 获得了一些基本思路 这些思路无非就是使用 ignore_user_abort(); //函数设置与客户机断开是否会终止脚本  set_time_limit(0); 实现一个无限死循环  在这个死循环里面 我们可以通过sleep进行适当的延迟间隔 来进行一定的操作  但是当我实际的来写代码的时候发现一些原来没有考虑过的问题

产生的新问题:

1.我们访问一次这个特殊页面就开启一个无限死循环(定时任务)  如果开启多个 那么对整个服务器的资源消耗是巨大的 非常影响网站的正常访问 所以我们必须要采取措施让这个无限死循环(定时任务)只能存在1个

2 我们需要有一个开关来控制这个无限循环  开启无限循环(定时任务)我们可以访问特殊页面开启 但是 关闭这个无限循环(定时任务) 我们也需要1个开关来控制 ----->用一个txt的内容来控制关闭

3.我们访问这个特殊页面后就开启了无限死循环(定时任务) 我们可以关闭这个特殊页面 但是这个无限死循环会一直执行下去 我们不清楚这个无限死循环(定时任务)都在干什么  都在忙什么  就算无限死循环(定时任务)出了问题 我们也不清楚 –-->专门做了一个简单的定时任务日志来监控 这个无限循环(定时任务)的运行情况

网页文件结构

browse_log.php 是日志文件 专门用来记录当天的定时任务的运行反馈

timed_task.php 是主文件 只要访问这个网页 就可以开启一个无限死循环(定时任务)

timed_task_18-08-22.log这个其实是真正的日志文件  browse_log.php是读取它的内容到网页上显示而已 但是 每一天都对应一个独立的log文件 log文件名字会变化 所以索性就显示到网页上

timed_task_config.txt 是无限循环(定时任务) 的配置文件  主要是用来关闭所有的无限循环(定时任务)和避免开启多个无限循环(定时任务)

用法:

开启无限循环(定时任务) :确保timed_task_config.txt 存在 并且内容为空  访问timed_task.php 等待页面反馈 如果页面进入卡住状态 则直接查看browse_log.php   看看日志里面是否记录启动成功

关闭无限循环(定时任务) :将timed_task_config.txt的内容改为close 然后等待一会 查看browse_log.php   看看日志里面是否记录关闭 记录了关闭才算关闭成功

日志查看:查看browse_log.php  有一点很关键注意看上下2个正常日志的时间间隔是否是符合你的要求 如果出现一些误差比较大的时间差 那么可以考虑是不是多开了无限循环  可以全部关闭重开下

主文件timed_task,php的代码

<?php
ignore_user_abort(); //函数设置与客户机断开是否会终止脚本的执行
set_time_limit(0); // 来设置一个脚本的执行时间为无限长
date_default_timezone_set(‘PRC‘); // 切换到中国的时间
$interval=20;//间隔多久执行一次
$timed_task_config_path="timed_task_config.txt";//负责让这个无限循环停止的一个开关 其实是控制定时任务机制的一个配置文件 如果该文件不存在或者 里面的内容为close 那么定时任务不会执行  如果为open 则会开启一个无限循环来进行监控和执行定时任务
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>定时任务</title>
</head>

<body>

<?php
//问题1 如何控制这些无限循环让他们停止
//问题2 如何避免打开多个无限循环增加服务器的资源消耗
//问题3 无限循环的日志监控和避免无限增加的处理办法
//控制用txt
//php定时计划任务

//检测定时任务的配置文件 是否存在或者里面的内容  //strpos($str1,"open")
if(file_exists($timed_task_config_path))
{
    //存在配置文件 开始检测里面的内容
    $str1="";
    $str1=trim(file_get_contents($timed_task_config_path));
    if (is_numeric(strpos($str1,"open"))) {
    ////1.内容为open 表示当前已经有定时任务线程在运行了 就不再额外执行定时任务
        send_timed_task_log("已经有一个定时任务进程存在 不能开启其他的进程");
        exit("已经有一个定时任务进程存在 不能开启其他的进程");
    } elseif (is_numeric(strpos($str1,"close"))) {
    ////2.内容为close表示要求定时任务关闭 更不用
        send_timed_task_log("配置文件要求关闭所有定时任务进程");
        exit("配置文件要求关闭所有定时任务进程");
    } else {
    ////3.如果不是open 和close 那么就锁定该文件然后修改里面的内容为open 修改成功
        $fp = fopen($timed_task_config_path, ‘w+‘);
        if(!is_writable($timed_task_config_path)){
            send_timed_task_log("无法写入配置文件 请刷新重试");
          exit("<p>无法写入配置文件 请刷新重试</p>");
        }
        flock($fp, LOCK_EX);
        fwrite($fp, ‘open‘);
        sleep(1);
        flock($fp, LOCK_UN);
        fclose($fp);

        //////////如果再次读取下配置文件内容判断是否写入成功 成功则开始执行后面的无限循环  不成功提示并结束网页
        $str1="";
        $str1=trim(file_get_contents($timed_task_config_path));
//        echo "<p>".$str1." </p>";
//        echo "<p>".strpos($str1,"open")." </p>";
//        exit();
        if (is_numeric(strpos($str1,"open"))) {
            ///////////////修改成功 获取到了定时任务进程的权利
            send_timed_task_log("启动成功 请关闭网页");

            do{
            $body="";
            if (file_exists($timed_task_config_path)) {
            $body = trim(file_get_contents($timed_task_config_path));
                if (is_numeric(strpos($body,"close")))
                {
                send_timed_task_log("配置文件要求关闭所有的定时任务");
                exit("<p>配置文件要求关闭所有的定时任务</p>");
                }
            } else {
                send_timed_task_log("没有找到定时任务配置文件");
                exit("<p>没有找到定时任务配置文件 进程结束</p>");
            }

            //-----------------------定时操作开头-------------------------------

            send_timed_task_log("<常规检测:一切正常>");

            //-----------------------定时操作结尾-------------------------------
            sleep(rand($interval-2,$interval+2)); // 函数延迟代码执行若干秒 为了避免完全一样 随机下间隔避免一些问题

            }while(true);

        }else{
            send_timed_task_log("没有获取到定时任务进程的权限 请刷新重试");
            exit("没有获取到定时任务进程的权限 请刷新重试");
        }
    }
}else{
    send_timed_task_log("定时任务配置文件不存在 不执行该");
    exit("<p>定时任务配置文件不存在 不执行该任务</p>");
}

//用来发送定时任务日志的函数
function send_timed_task_log($str) {

      //接收从脚本传递来的日志信息 判断当前的日期 把这个日志信息存储到当前日期命名的日志文件里
    if (trim($str)<>""){
    $nowtimefilepath="timed_task_".date("y-m-d",time()).".log";
    $send_str=date("y-m-d",time());
    $send_str=date("Y-m-d H:i:s",time())."----".trim($str)."\r\n";
    file_put_contents($nowtimefilepath,$send_str,FILE_APPEND);//????? ???????
    }else{

    }

}
?>
</body>
</html>

完整下载地址:

https://pan.baidu.com/s/1__xp1oSVdT2aDXj5BjxYHw

原文地址:https://www.cnblogs.com/zjl8455482/p/9521194.html

时间: 2024-10-05 03:09:12

php虚拟主机下实现定时任务(仅供参考)的相关文章

Unity上一页下一页切换功能实现源码(仅供参考)

在做项目时我们有时需要实现切换上一页下一页图片,切换上一首下一首歌曲等等类似的功能.这里写了个简单的实现源码(仅供参考),要是有更好的方法欢迎提出来,共同进步~ 以切换上一页下一页图片为例: using UnityEngine; using System.Collections; using UnityEngine.UI; public class PanoramaManager : MonoBehaviour { //图片存放数组 Texture2D[] arr; //下一张按钮计数索引 in

Ubuntu 12.04 分区方案(仅供参考)

Ubuntu 12.04 分区方案(仅供参考) 总空间大小:50G 目录 建议大小 实际大小 格式 描述 / 10G~20G 10G ext4 根目录 swap <2048M 1G swap 交换空间 /boot 200M左右 100M ext4 Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img文件都位于这个目录中.在一般情况下,GRUB或LILO系统引导管理器也位于这个目录:启动撞在文件存放位置,如kernels,initrd,grub. /tmp 5G左

Django开发的简单CMDB系统(仅供参考)

自己基于django开发的一个简单机房机柜CMDB系统,仅供参考.欢迎在下面留言,提出修改意见. 可实现增删改查. 权限未做,很多功能都没做,只做一个最基本的,初学. 前端模板用的inspinia2.5,和jumpserver用的一样的模块,所以看着差不多.模板可自行百度搜索. 放到pycharm或者linux环境下,配置好,运行就可以. domo 登录:http://42.62.6.54:8001/index.html  ,默认用户名hequan,密码123456. 下载链接:http://p

如何有效防止DEDE织梦系统被挂木马安全设置(仅供参考)

尊敬的客户,您好!     感谢广大客户对我司工作的信任和支持!      我司在最近的一个多月内陆续发现多起因 DedeCMS 安全漏洞造成网站被上传恶意脚本的事件,入侵者可利用恶意脚本对外发送大量数据包,严重占用CPU资源与服务器带宽,影响极为恶劣.为保证服务稳定,即日起一旦发现网站存在此类恶意脚本,我们将立即暂停该网站的服务直到问题修复.如果您正在使用 DedeCMS,请立即检查是否已经存在恶意脚本,并更新程序到最新版本或应用相关补丁.     迄今为止,我们发现的恶意脚本文件有    

四套写入方案(仅供参考)

四套写入方案 第一套:字节流读取写入方案 FileInputStream :字节流方式读取文本文件 FileOutputStream:字节流写入硬盘 第二套:字符流读取写入方案 FileReader:字符流读取文本 FileWriter:字符流写入文本 第三套: BufferedReader:自定义缓存大小 BufferedWriter:写入文本 一般和FileReader和FileWriter结合使用 第四套:可以读取二进制(img图片等 ) DataInputStream:将本地的img加载

信息与通信工程——重要国际学术会议和国际顶级期刊(仅供参考)

一.信息与通信工程的重要国际学术会议 主要包含两类: A类会议:本学科最顶尖级水平的国际会议: B类会议:学术水平较高.组织工作成熟.按一定时间间隔系列性召开的国际会议. A类会议(序号不表示优先顺序) 序号 / 英文名称 / 英文简称 / 中文名称 / 备注 1.IEEE International Conference on Acoustics, Speech and Signal Processing /  ICASAP /     IEEE 声学.语音和信号处理国际会议 2.IEEE I

开发问题---数据库字段前出现“—”(保存留用,仅供参考)

开发时数据调用往往会用到占位符,然而刚开始使用很容易碰见sql语句在SQLServer中查询时显示"-",如下代码: #region 先判断是否有记录,再确定使用哪条命令 //查询数据库 20140713 commandText = "use zzbjcdzz select *" + "from [T_VillageBasicInfo] " + "where ltrim(rtrim([code]))='{0}' "; //注意

mysql 千万级数据查询效率实践,分析 mysql查询优化实践--本文只做了一部分,仅供参考

数据量, 1300万的表加上112万的表 注意: 本文只做了部分优化,并不全面,仅供参考, 欢迎指点. 请移步tim查看,因为写的时候在tim写的,粘贴过来截图有问题,就直接上链接了. https://823948977.docs.qq.com/T5e6dBYLoZz?opendocxfrom=tim 文章内容类似截图:

单相变频电源的功能特点--深圳市中港扬盛仅供参考

变频电源的种类分为单相和三相变频,其在电压及功率上都有不同的作用和特点.今天大家分享的是关于中港扬盛的单相变频电源的一些特点: 1.能够有效的抗干扰作用:比如通过Y/△接线的隔离后,就能够阻止一部分谐波的传输:2.能够阻抗变换作用:主要是增加系统阻抗,这样就能使保护装置等容易配合:3.能够稳定系统电压的作用:比如像在启动大负荷设备的时候,能够减少启动时大电流对系统电压的影响:4.能够防止系统接地的作用:当隔离负荷侧发生单相接地时,不会造成整个系统单相接地:5.能够降低短路电流:当负荷侧发生短路事