Вход Регистрация
Файл: contao-3.5.8/system/modules/core/controllers/FrontendCron.php
Строк: 136
<?php

/**
 * Contao Open Source CMS
 *
 * Copyright (c) 2005-2016 Leo Feyer
 *
 * @license LGPL-3.0+
 */

namespace Contao;


/**
 * Command scheduler controller.
 *
 * @author Leo Feyer <https://github.com/leofeyer>
 */
class FrontendCron extends Frontend
{

    
/**
     * Initialize the object (do not remove)
     */
    
public function __construct()
    {
        
parent::__construct();

        
// See #4099
        
define('BE_USER_LOGGED_IN'false);
        
define('FE_USER_LOGGED_IN'false);
    }


    
/**
     * Run the controller
     */
    
public function run()
    {
        
// Do not run if there is POST data or the last execution was less than a minute ago
        
if (!empty($_POST) || $this->hasToWait())
        {
            return;
        }

        
$arrLock = array();
        
$arrIntervals = array('monthly''weekly''daily''hourly''minutely');

        
// Store the current timestamps
        
$arrCurrent = array
        (
            
'monthly'  => date('Ym'),
            
'weekly'   => date('YW'),
            
'daily'    => date('Ymd'),
            
'hourly'   => date('YmdH'),
            
'minutely' => date('YmdHi')
        );

        
// Get the timestamps from tl_cron
        
$objLock $this->Database->query("SELECT * FROM tl_cron WHERE name !='lastrun'");

        while (
$objLock->next())
        {
            
$arrLock[$objLock->name] = $objLock->value;
        }

        
// Create the database entries
        
foreach ($arrIntervals as $strInterval)
        {
            if (!isset(
$arrLock[$strInterval]))
            {
                
$arrLock[$strInterval] = 0;
                
$this->Database->query("INSERT INTO tl_cron (name, value) VALUES ('$strInterval', 0)");
            }
        }

        
// Run the jobs
        
foreach ($arrIntervals as $strInterval)
        {
            
$intCurrent $arrCurrent[$strInterval];

            
// Skip empty intervals and jobs that have been executed already
            
if (empty($GLOBALS['TL_CRON'][$strInterval]) || $arrLock[$strInterval] == $intCurrent)
            {
                continue;
            }

            
// Update the database before the jobs are executed, in case one of them fails
            
$this->Database->query("UPDATE tl_cron SET value=$intCurrent WHERE name='$strInterval'");

            
// Add a log entry if in debug mode (see #4729)
            
if (Config::get('debugMode'))
            {
                
$this->log('Running the ' $strInterval ' cron jobs'__METHOD__TL_CRON);
            }

            foreach (
$GLOBALS['TL_CRON'][$strInterval] as $callback)
            {
                
$this->import($callback[0]);
                
$this->{$callback[0]}->{$callback[1]}();
            }

            
// Add a log entry if in debug mode (see #4729)
            
if (Config::get('debugMode'))
            {
                
$this->log(ucfirst($strInterval) . ' cron jobs complete'__METHOD__TL_CRON);
            }
        }
    }


    
/**
     * Check whether the last script execution was less than a minute ago
     *
     * @return boolean
     */
    
protected function hasToWait()
    {
        
$return true;

        
// Get the timestamp without seconds (see #5775)
        
$time strtotime(date('Y-m-d H:i'));

        
// Lock the table
        
$this->Database->lockTables(array('tl_cron'=>'WRITE'));

        
// Get the last execution date
        
$objCron $this->Database->prepare("SELECT * FROM tl_cron WHERE name='lastrun'")
                                  ->
limit(1)
                                  ->
execute();

        
// Add the cron entry
        
if ($objCron->numRows 1)
        {
            
$this->updateCronTxt($time);
            
$this->Database->query("INSERT INTO tl_cron (name, value) VALUES ('lastrun', $time)");
            
$return false;
        }

        
// Check the last execution time
        
elseif ($objCron->value <= ($time $this->getCronTimeout()))
        {
            
$this->updateCronTxt($time);
            
$this->Database->query("UPDATE tl_cron SET value=$time WHERE name='lastrun'");
            
$return false;
        }

        
$this->Database->unlockTables();

        return 
$return;
    }


    
/**
     * Update the cron.txt file
     *
     * @param integer $time
     */
    
protected function updateCronTxt($time)
    {
        
File::putContent('system/cron/cron.txt'$time);
    }
}
Онлайн: 1
Реклама