關鍵字: shell_exec ,php 安全模式
shell_exec 解決你新增定時任務的問題 ,php 安全模式開啟的時候是沒辦法使用 shell_exec 函數的。
定時任務可以儲存到MySQL或檔案裡,然後用crontab 去跑mysql或檔案
使用crontab,如:
0 0 30 * * 执行文件
mysql 預存程序也可以跑定時任務
用獨立的定時任務中間件管理, 使用者定時任務不適合放到crontab中
我引用一下Naist首先你要會使用crontab,沒錯,不會用就自己百度了,這裡不做回答,可以寫一篇博客了。 然後在命令列
crontab -e
了之後
0 0 30 * * php 需要定期执行的php脚本位置
有可能不是crontab,我之前用node.js寫過一個使用者可以自己定時的WebSocket,在後台掛起。當使用者向這個WebSocket發送請求時,把定時的時間記錄到一個快取檔案中(JSON),然後設定node.js自己的計時器。
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: '应用成功'}))); // 给请求者反馈 }); });
php的話,選擇定時任務只能用crontab,這樣最短的輪訓時間是1秒如果想要1秒以內,就得另尋他法了。
關鍵字: shell_exec ,php 安全模式
shell_exec 解決你新增定時任務的問題 ,php 安全模式開啟的時候是沒辦法使用 shell_exec 函數的。
定時任務可以儲存到MySQL或檔案裡,然後用crontab 去跑mysql或檔案
使用crontab,如:
mysql 預存程序也可以跑定時任務
用獨立的定時任務中間件管理, 使用者定時任務不適合放到crontab中
我引用一下Naist
首先你要會使用crontab,沒錯,不會用就自己百度了,這裡不做回答,可以寫一篇博客了。
然後在命令列
了之後
有可能不是crontab,我之前用
node.js
寫過一個使用者可以自己定時的WebSocket,在後台掛起。當使用者向這個WebSocket發送請求時,把定時的時間記錄到一個快取檔案中(JSON),然後設定node.js
自己的計時器。如果這個WebSocket服務掛掉了的話,只要重新啟動這個後台腳本,腳本會透過快取的JSON裡記錄的時間,重新設定排程任務。這裡我可以放一些程式碼,核心的程式碼省略,另外加了點註解供參考
php的話,選擇定時任務只能用crontab,這樣最短的輪訓時間是1秒
如果想要1秒以內,就得另尋他法了。