Есть расширение (extension), которое требует обслуживающий скрипт. Скрипт должен выполняться по крону раз в 5 минут. Логика хранится в методе myExt::Make()
Как можно вызвать его по крону? Написать расширение для yiic и дергать по крону его, или как то можно в отдельном скрипте оформить?
создаю команду в /protected/commands/ (см руководство)
создаю файл для точки входа - 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();//а тут создается консольное приложение
?>
Создаю конфиг. В конфиге можно подгружать абсолютно все что и в главном, с поправкой только на то, что тут нет контроллеров, урл генерить никто не будет и т.п.
ставлю задачу на крон: 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% - рабочее
<?
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',
)
);