Выполнение yii скриптов по крону.

Есть расширение (extension), которое требует обслуживающий скрипт. Скрипт должен выполняться по крону раз в 5 минут. Логика хранится в методе myExt::Make()

Как можно вызвать его по крону? Написать расширение для yiic и дергать по крону его, или как то можно в отдельном скрипте оформить?

Честно говоря, я не понял что Вы написали :(

Но по крону Вы можете вызывать как пхп файл через cli

так и с помозью кроновского способа GET http://…/1.php

Я делаю так.

  1. создаю команду в /protected/commands/ (см руководство)

  2. создаю файл для точки входа - console.php:


<?php

$yii='E:\XAMPP\htdocs\Yii\yii.php';

$config=dirname(__FILE__).'/protected/config/console.php';//тут указывается другой файл конфига, не main.php как в index.php


// remove the following line when in production mode

defined('YII_DEBUG') or define('YII_DEBUG',true);


require_once($yii);

Yii::createConsoleApplication($config)->run();//а тут создается консольное приложение

?>

  1. Создаю конфиг. В конфиге можно подгружать абсолютно все что и в главном, с поправкой только на то, что тут нет контроллеров, урл генерить никто не будет и т.п.

  2. ставлю задачу на крон: php /path/to/console.php yourCommand - вызов интерпретатора, далее путь к файлу точки входа и для самой точки входа параметр - какую команду исполнять.

ВАЖНОЕ ЗАМЕЧАНИЕ!!!

По умолчанию и главное приложение и консольное пишут лог в /protected/runtime/application.log. Там идет ротация логов, и через какое-то время создается новый файл лога. Обычное приложение и консольное ВЫЗЫВАЮТСЯ ОТ ИМЕНИ РАЗНЫХ ЮЗЕРОВ!!! Это надо иметь в виду когда ставим права. Я с правами заморачиваться не стал, просто назначил консоьному другое имя файла. Это и удобнее отслеживать.

Расширение не может вызваться по крону. По крону вызывается приложение, которое в себя включает это расширение. Делать это вышеописанным способом - создается команда, которая и выполняет нужное действие. Я сам так счетчики реализовывал, только не как расширение, а как компонент просто.

Вот моя команда, только тут немного по-другому сделано, у меня команды наследуются от общей. Я это как расширение сделал - доработаю и выложу.


class CountCommand extends GenericCommand

{


	public function runCmd($args)

	{

		//если база нормальная, следующая строчка не нужна

		Yii::app()->db->pdoInstance->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

		CounterManager::refresh();

	}

}

По сути тут только вызов статического метода. Вам именно так и надо. Но все дело в том, что это должно быть в инклудах, то есть в конфиге консольного приложения вы должны указать в разделе импорта свое расширение.

PS. Помня про реацию на мои предыдущие ответы вам, критиковать не надо, это работает для меня, я абсолютно уверен что и для большинсва остальных. Если у вашего Yii другое поведение - это не моя проблема. Просто попробуйте такое решение. 100% - рабочее

кладем в protected/commands




<? 


class CronCommand extends CConsoleCommand

{


public function getHelp()

	{

		return <<<EOD

USAGE

  yiic cron <component ID> <method name>


DESCRIPTION

  Run some method of component.  


PARAMETERS

 

 * <component ID> - component id  as used in  Yii::app()->component  

 

 * <method name> - some method of component.


DEMO


  yiic cron mail send     ( analog for: Yii::app()->mail->send(); )


EOD;

	}


    public function run($args)

    {

        $com = 'Yii::app()->'.$args[0].'->'.$args[1].'();';

        Yii:log('info', 'console.cron','Run action: '.$com);

        eval($com);

        Yii:log('info', 'console.cron','Stop action: '.$com);

    }

}


?>



Чтобы не писать 2 конфига, надо просто конфиг консоли оформить в следующем виде:




<?php


// This is the configuration for yiic console application.

// Any writable CConsoleApplication properties can be configured here.


$main = require(dirname(__FILE__).'/main.php'); // считываем основнйо конфиг


unset($main['defaultController']);  // без этого не заводится


return CMap::mergeArray(

    $main, 

    array(

    	'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',

    	'name'=>'Console Application',

    )

);



Вот собственно и все.

P.S. GET в кроне - это плохой тон.