linux - php melaksanakan tugas yang dijadualkan?
巴扎黑
巴扎黑 2017-06-27 09:17:40
0
8
1151
用户添加定时任务后如
  每月30 号发工资
  订单到期未付款恢复
这种是如何做的?
直接在Linux 操作crontab 可以,
但是用户添加一个任务就加到 crontab 怎么实现?
巴扎黑
巴扎黑

membalas semua(8)
扔个三星炸死你

Kata kunci: shell_exec, mod selamat php

shell_exec menyelesaikan masalah anda menambah tugasan berjadual Fungsi shell_exec tidak boleh digunakan apabila mod selamat PHP dihidupkan.

学霸

Tugas berjadual boleh disimpan dalam MySQL atau fail, dan kemudian gunakan crontab untuk menjalankan mysql atau fail

为情所困

Gunakan crontab, seperti:

0 0 30 * * 执行文件
洪涛

prosedur tersimpan mysql juga boleh menjalankan tugas berjadual

曾经蜡笔没有小新

Gunakan middleware tugas berjadual bebas untuk mengurus, tugas berjadual pengguna tidak sesuai untuk diletakkan dalam crontab

为情所困

Saya akan petik Naist
Pertama sekali, anda perlu menggunakan crontab Ya, jika anda tidak tahu cara menggunakannya, saya tidak akan menjawabnya di sini .
Kemudian dalam baris arahan

crontab -e

Selepas

0 0 30 * * php 需要定期执行的php脚本位置
習慣沉默

Mungkin ia bukan crontab saya menggunakan node.js写过一个用户可以自己定时的WebSocket,在后台挂起。当用户向这个WebSocket发送请求时,把定时的时间记录到一个缓存文件中(JSON),然后设置node.jspemasa saya sendiri sebelum ini.

Jika perkhidmatan WebSocket ditutup, cuma mulakan semula skrip latar belakang dan skrip akan menetapkan semula tugas yang dijadualkan berdasarkan masa yang direkodkan dalam JSON yang dicache. Saya boleh meletakkan beberapa kod di sini, kod teras ditinggalkan, dan beberapa komen ditambah untuk rujukan

'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: '应用成功'}))); // 给请求者反馈
    });
});
过去多啦不再A梦

Untuk PHP, anda hanya boleh menggunakan crontab untuk memilih tugas berjadual, jadi masa latihan putaran terpendek ialah 1 saat
Jika anda mahu dalam masa 1 saat, anda perlu mencari cara lain.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan