關鍵字: shell_exec ,php 安全模式
shell_exec 解決你新增定時任務的問題 ,php 安全模式開啟的時候是沒辦法使用 shell_exec 函數(shù)的。
我引用一下Naist
首先你要會使用crontab,沒錯,不會用就自己百度了,這裡不做回答,可以寫一篇博客了。
然後在命令列
crontab -e
了之後
0 0 30 * * php 需要定期執(zhí)行的php腳本位置
有可能不是crontab,我之前用node.js
寫過一個使用者可以自己定時的WebSocket,在後臺掛起。當使用者向這個WebSocket發(fā)送請求時,把定時的時間記錄到一個快取檔案中(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}); // 創(chuàng)建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);
};
// 根據(jù)ScheduleList重新創(chuàng)建計劃任務的方法
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} * * *`, () => {
// 此處省略了任務創(chuàng)建的具體操作,用的cross-spawn包
});
JobList[id] = jobId;
}
};
loadJobs(); // 啟動時載入時間
rerunJobs(); // 根據(jù)時間重新創(chuàng)建計劃任務
wss.on('connection', ws => {
ws.on('message', message => {
// 省略了傳入數(shù)據(jù)的解析
// 如果任務存在,先刪除任務
if(JobList[id]) {
crontab.cancelJob(JobList[id]);
delete ScheduleList[id];
delete JobList[id];
}
// 重新添加任務
let jobId = crontab.scheduleJob(`${minute} ${hour} * * *`, () => {
// 同rerunJobs()里的創(chuàng)建操作,省略細節(jié)
});
ScheduleList[id] = {id: id, hour: hour, minute: minute};
JobList[id] = jobId;
saveJobs(); // 保存任務計劃時間
ws.send(JSON.stringify(response(null, {message: '應用成功'}))); // 給請求者反饋
});
});