搜索

首页  >  问答  >  正文

linux - php执行定时任务?

雷雷
巴扎黑巴扎黑2784 天前1173

全部回复(8)我来回复

  • 扔个三星炸死你

    扔个三星炸死你2017-06-27 09:19:40

    关键词: shell_exec ,php 安全模式

    shell_exec 解决你添加定时任务的问题 ,php 安全模式开启的时候是没法使用 shell_exec 函数的。

    回复
    0
  • 欧阳克

    欧阳克2017-06-27 09:19:40

    定时任务可以存储到MySQL或者文件里,然后用crontab 去跑mysql或文件

    回复
    0
  • 为情所困

    为情所困2017-06-27 09:19:40

    使用crontab,如:

    0 0 30 * * 执行文件

    回复
    0
  • PHP中文网

    PHP中文网2017-06-27 09:19:40

    mysql 存储过程也可以跑定时任务

    回复
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-27 09:19:40

    用独立的定时任务中间件管理, 用户定时任务不适合放到crontab中

    回复
    0
  • 为情所困

    为情所困2017-06-27 09:19:40

    我引用一下Naist
    首先你要会使用crontab,没错,不会用就自己百度了,这里不做回答,可以写一篇博客了。
    然后在命令行

    crontab -e

    了之后

    0 0 30 * * php 需要定期执行的php脚本位置

    回复
    0
  • 習慣沉默

    習慣沉默2017-06-27 09:19:40

    有可能不是crontab,我之前用node.js写过一个用户可以自己定时的WebSocket,在后台挂起。当用户向这个WebSocket发送请求时,把定时的时间记录到一个缓存文件中(JSON),然后设置node.js自己的定时器。

    如果这个WebSocket服务挂掉了的话,只要重新启动这个后台脚本,脚本会通过缓存的JSON里记录的时间,重新设定计划任务。这里我可以放一些代码,核心的代码被省略,另外加了点注释供参考

    'use strict';
    // 一些NodeJS包
    const WebSocket = require('ws');
    const path = require('path');
    const crontab = require('node-crontab');
    const spawn = require('cross-spawn');
    const fsExtra = require('fs-extra');
    const objectValues = require('object-values');
    
    // 省略了一些配置
    
    const wss = new WebSocket.Server({port: 8080}); // 创建WebSocket服务
    
    let ScheduleList = {}; // 这个为存储时间的JS对象
    let JobList      = {}; // 这个为存储定时任务ID的JS对象,如果要取消任务,就通过这个来查找定时任务ID
    
    // 省略了日志方法
    
    // 故障后重启载入任务时间的方法
    const loadJobs = () => {
        let jobsCache = path.resolve(__dirname, './config/scheduler.jobs');
    
        if(fsExtra.pathExistsSync(jobsCache)) {
            ScheduleList = fsExtra.readJsonSync(jobsCache, {throw: false}) || {};
        }
    };
    // 用户传入时间时将任务时间对象ScheduleList重写到文件的方法
    const saveJobs = () => {
        let jobsCache = path.resolve(__dirname, './config/scheduler.jobs');
        fsExtra.outputJsonSync(jobsCache, ScheduleList);
    };
    // 根据ScheduleList重新创建计划任务的方法
    const rerunJobs = () => {
        for(let jobScheduleId in ScheduleList) {
            let hour   = ScheduleList[jobScheduleId].hour || 0;
            let minute = ScheduleList[jobScheduleId].minute || 0;
    
            let jobId = crontab.scheduleJob(`${minute} ${hour} * * *`, () => {
                // 此处省略了任务创建的具体操作,用的cross-spawn包
            });
    
            JobList[id] = jobId;
        }
    };
    
    loadJobs(); // 启动时载入时间
    rerunJobs(); // 根据时间重新创建计划任务
    
    wss.on('connection', ws => {
        ws.on('message', message => {
            // 省略了传入数据的解析
    
            // 如果任务存在,先删除任务
            if(JobList[id]) {
                crontab.cancelJob(JobList[id]);
                delete ScheduleList[id];
                delete JobList[id];
            }
    
            // 重新添加任务
            let jobId = crontab.scheduleJob(`${minute} ${hour} * * *`, () => {
                // 同rerunJobs()里的创建操作,省略细节
            });
    
            ScheduleList[id] = {id: id, hour: hour, minute: minute};
            JobList[id]      = jobId;
    
            saveJobs(); // 保存任务计划时间
    
            ws.send(JSON.stringify(response(null, {message: '应用成功'}))); // 给请求者反馈
        });
    });

    回复
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-27 09:19:40

    php的话,选择定时任务只能用crontab,这样最短的轮训时间是1秒
    如果想要1秒以内,就得另寻他法了。

    回复
    0
  • 取消回复