删除列表上的作业后,Crontab文件是否已损坏?

时间:2015-04-22 14:34:58

标签: php shell curl cron crontab

我使用数据库控制的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文件时,它的工作正常。怎么了?

问候。

0 个答案:

没有答案