<?php 
namespace Jackbooted\Cron; 
 
use \Jackbooted\DB\ORM; 
use \Jackbooted\Util\Log4PHP; 
/** 
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved. 
 * 
 * Written by Brett Dutton of Jackbooted Software 
 * brett at brettdutton dot com 
 * 
 * This software is written and distributed under the GNU General Public 
 * License which means that its source code is freely-distributed and 
 * available to the general public. 
 */ 
 
class Scheduler extends ORM { 
 
    private static $log = null; 
    private static $dao = null; 
 
    /** 
     * @return void 
     */ 
    public static function init () { 
        self::$log = Log4PHP::logFactory ( __CLASS__ ); 
        self::$dao = new SchedulerDAO (); 
    } 
 
    public static function load ( $id ) { 
        return new Scheduler ( self::$dao->oneRow ( $id ) ); 
    } 
 
    public static function getList ( $all=false ) { 
        if ( $all ) { 
            $where =  [ 'where' =>  [ ] ]; 
        } 
        else { 
            $where =  [ 'where' =>  [ 'active' => SchedulerDAO::ACTIVE ] ]; 
        } 
 
        $table = self::$dao->search ( $where ); 
        return self::tableToObjectList ( $table ); 
    } 
 
    /** 
     * @param  $data 
     * @return void 
     */ 
    public function __construct( $data ) { 
        parent::__construct ( self::$dao, $data ); 
    } 
 
    /** 
     * Check if there are any upcoming schedules 
     */ 
    public static function check () { 
        $numAdded = 0; 
 
        foreach ( self::getList () as $sheduleItem ) { 
 
            $storedLastRunTime = strtotime( ( $sheduleItem->lastRun == '' ) ? $sheduleItem->start : $sheduleItem->lastRun ); 
            $previousCalculatedRunTime = CronParser::lastRun( $sheduleItem->cron ); 
 
            // This looks at when the item had run. If the stored value is less than 
            // the calculated value means that we have past a run period. So need to run 
            if ( $storedLastRunTime <  $previousCalculatedRunTime ) { 
 
                // Update the run time to now 
                $sheduleItem->lastRun = strftime ( '%Y-%m-%d %H:%M', $previousCalculatedRunTime ); 
                $sheduleItem->save (); 
 
                // Enqueue a new item to run 
                $job = new Cron (  [ 'ref' => $sheduleItem->id, 
                                     'cmd' => $sheduleItem->cmd, ] ); 
                $job->save (); 
                $numAdded ++; 
            } 
        } 
        return $numAdded; 
    } 
} 
 
 |