我使用数据库控制的cronjobs作为我的时事通讯。目前crontab作业添加/删除功能工作正常,但当删除列表上的作业时主触发器文件无法正常工作。所以这是我的工作台;
任务列表表;
ID campaign_id remove date cron_command
1 1 0 2015-04-22 17:00:00 * * * * * curl -s http://example.com/tasks.php?ID=1
主要触发器文件(cron.php)正在检查此表,如果日期到达当前日期,则将cron_command添加到crontab,这里的一切正常。 tasks.php文件工作正常并发送所有" ID1"竞选邮件。
完成广告系列任务并成功发送所有邮件后,上述记录已更新为
ID campaign_id remove date cron_command
1 1 1 2015-04-22 17:00:00 * * * * * curl -s http://example.com/tasks.php?ID=1
主触发器文件检查删除1个标记的命令,并且应该删除两侧的记录(crontab / db表)。但是它不会删除crontab和db表上的命令,主要触发器文件也会出现错误" php命令错误:没有指定输入文件"," curl命令错误:400错误请求",& #34; wget命令:模糊重定向"
Crontab经理类
class Crontab {
// In this class, array instead of string would be the standard input / output format.
// Legacy way to add a job:
// $output = shell_exec('(crontab -l; echo "'.$job.'") | crontab -');
static private function stringToArray($jobs = '') {
$array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
foreach ($array as $key => $item) {
if ($item == '') {
unset($array[$key]);
}
}
return $array;
}
static private function arrayToString($jobs = array()) {
$string = implode("\r\n", $jobs);
return $string;
}
static public function getJobs() {
$output = shell_exec('crontab -l');
return self::stringToArray($output);
}
static public function saveJobs($jobs = array()) {
$output = shell_exec('echo "'.self::arrayToString($jobs).'" | crontab -');
return $output;
}
static public function doesJobExist($job = '') {
$jobs = self::getJobs();
if (in_array($job, $jobs)) {
return true;
} else {
return false;
}
}
static public function addJob($job = '') {
if (self::doesJobExist($job)) {
return false;
} else {
$jobs = self::getJobs();
$jobs[] = $job;
return self::saveJobs($jobs);
}
}
static public function removeJob($job = '') {
if (self::doesJobExist($job)) {
$jobs = self::getJobs();
unset($jobs[array_search($job, $jobs)]);
return self::saveJobs($jobs);
} else {
return false;
}
}
}
主要触发器文件cron.php
/* Task List Modifier */
$modChr = new Crontab();
$opTasks = $myconn->query("SELECT * FROM tasks ORDER BY remove DESC") or die(mysqli_error($myconn));
while($opTasksRs = $opTasks->fetch_assoc()){
/* Remove Crons */
if($opTasksRs['remove']==1){
if($modChr->removeJob($opTasksRs['cron_command'])){
$myconn->query("DELETE FROM tasks WHERE ID=". $opTasksRs['ID'] ."");
}else{
echo('Command Not Executed');
}
}
/* Add Crons */
else{
if($opTasksRs['date']<=date('Y-m-d H:i:s')){
$modChr->addJob($opTasksRs['cron_command']);
}
}
} $opTasks->free();
我的问题很快;通过shell添加新的cron作业后cron.php文件不起作用,但是当我尝试通过浏览器运行cron.php文件时,它的工作正常。怎么了?
问候。