2015-04-17 149 views
3

我的crontab有大约200多个预定作业,并且很难记住何时以及应该运行什么参数。记住所有脚本名称更加困难。而且如果团队中的某个人会删除一些作业,我会遇到麻烦 - crontab会被备份,但是它会重新执行它,我应该警告某些内容已被删除或者只是简单地将其删除。运行没有crontab的php脚本

因此,我正在考虑创建一个将启动所有其他作业的单个cron作业,这些作业将保存在数据库中并通过Web界面进行管理。

我现在有一个问题。它是如何站点类似crontab的频率 - 我的意思是这样的:* * 1 * *。当我的单个脚本启动时,应该很容易知道应该运行哪个脚本。我需要一个建议,因为现在我所能想到的就是测量每次运行的时间(%)。

+0

'包括()'在一个cron的所有其它脚本...但脚本调用的时机将是相同...或更简单的需要时间和sc在你的数据库中篡改名字并给它们标记,如'0或1',0表示不运行,1表示运行... –

+0

我可以建议看看supervisord –

+0

@ AntonyD'Andrea,我真的不想用其他系统。这并不是那么复杂...... –

回答

1

include()在一个文件中的所有cron脚本,

所以当cron作业将在那个时候运行它会运行所有其他脚本,但是计时将是相同..

我们解决时间问题, 创建两个数据库表

1) Cron 

id(int 11)    name(varchar)   flag(enum) 
Auto Increament ID  name of php file  enabled/disabled 

2) CronTimings 

    id(int 11) fk_cron_id (int 11)   time (time)    day(varchar) 
    Auto incr  foreign key of first table  time to run the script CSV days (i.e. Mon,Tue,Wed) 

,并存储在最后时间的主人的cron已经跑值主表

last_ran_time (time) 
value of last time when 
cron has ran 

备注:第二个表可以有多个条目,其中fk_cron_id(一个脚本可以有多个计时)

现在

在单一的cron文件

$last_ran = "05:02:15"; // from the master table 
$day = date('D'); 
$qry = "select * from cron c 
     left join cronTimings ct on ct.fk_cron_id = c.id 
     where ct.id in (select id from cronTimings where day like = '%".$day."%') and ct.time between '$last_ran' and '".date('H:i:s')."'"; 

//fetch data 
foreach($crons as $crn) 
{ 
    include($crn['file']) 
} 

您可以运行此文件每半或一个小时,因此,如果任何的cron有这个时间之间运行,它会使用mysql between中获取...

让我知道如果任何问题......

+0

太棒了!这就是我要做的一些修改 - 我想测量每个脚本的perfomace并将表保存到表 –

+0

@ProstoTrader是..这个脚本将需要一些修改..但它会给你一个kickstart .. :) –

+0

如果我想每分钟运行一次脚本,我应该怎么做? –