Bonjour,
J’ai un gros souci et après plusieurs recherches, et plusieurs heures, je ne réussis pas à trouver la solution…
Je souhaite tout simplement créer une commande que je lancerais régulièrement à l’aide de cron.
J’ai donc créé un fichier cron.php :
defined('YII_DEBUG') or define('YII_DEBUG',true);
define('YII_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'../../../../library/Yii');
define('ROOT_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR.'../../../..');
define('CUSTOM_COMMAND', dirname(__FILE__).DIRECTORY_SEPARATOR.'../../console');
require_once(YII_PATH.'/yii.php');
// we'll use a separate config file
$configFile=dirname(__FILE__).DIRECTORY_SEPARATOR.'/cronconfig.php';
// creating and running console application
$app = Yii::createConsoleApplication($configFile);
//$app->commandRunner->addCommands(YII_PATH.'/cli/commands');
$app->commandRunner->addCommands(CUSTOM_COMMAND.'/commands');
$app->run();
Un fichier de configuration (équivalent de console.php et main.php) cronconfig.php :
date_default_timezone_set('Europe/Paris');
mb_internal_encoding('UTF-8');
error_reporting(E_ALL & ~(E_NOTICE | E_STRICT));
$root = realpath(dirname(__FILE__) .DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'..');
// Setup path aliases
Yii::setPathOfAlias('root', $root);
Yii::setPathOfAlias('library', $root . DIRECTORY_SEPARATOR . 'library');
Yii::setPathOfAlias('app', $root . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR .'App');
Yii::setPathOfAlias('compfront', $root . DIRECTORY_SEPARATOR . 'application' . DIRECTORY_SEPARATOR .'modules' . DIRECTORY_SEPARATOR . 'frontend' . DIRECTORY_SEPARATOR .'components');
Yii::setPathOfAlias('public', $root. DIRECTORY_SEPARATOR . 'public');
Yii::setPathOfAlias('temp', $root. DIRECTORY_SEPARATOR . 'temp');
Yii::setPathOfAlias('emailtemplates', $root. DIRECTORY_SEPARATOR . 'library'. DIRECTORY_SEPARATOR .'App' . DIRECTORY_SEPARATOR .'emails' );
Yii::setPathOfAlias('vendor', $root . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR .'Vendor');
//define('ROOT_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR.'../../../..');
return array(
// This path may be different. You can probably get it from `config/main.php`.
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'../',
'name'=>'Cron',
'preload'=>array('log'),
'import'=>array(
'application.components.*',
'application.models.*',
),
// We'll log cron messages to the separate files
'components'=>array(
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'logFile'=>'cron.log',
'levels'=>'error, warning',
),
array(
'class'=>'CFileLogRoute',
'logFile'=>'cron_trace.log',
'levels'=>'trace',
),
),
),
// Your DB connection
'db' => array(
'connectionString' => 'mysql:host=localhost;dbname=myDB',
'username' => 'myDB',
'password' => 'myDBPassword',
'enableProfiling' => true,
'charset' => 'utf8',
'schemaCachingDuration' => YII_DEBUG ? 0 : 86400000, // 1000 days
'enableParamLogging' => YII_DEBUG,
),
),
'commandMap' => array(
'AutoCron' => array(
'class' => 'application.modules.console.commands.AutoCronCommand',
'dbConnection' => 'db',
),
),
);
Mon fameux fichier de commande est le suivant AutoCronCommand.php :
class AutoCronCommand extends CConsoleCommand{
public function run($arg){
$user = User::model()->findByPk(31);
$user->user_name = 'CHANGE RUN !!!';
$user->save();
}
public function actionChangeName()
{
$user = User::model()->findByPk(31);
$user->user_name = 'CHANGE METHOD';
$user->save();
}
}
Mais… lorsque j’exécute :
php ../frontend/config/cron.php AutoCron
Ca me retourne une erreur :
PHP Error[2]: include(User.php): failed to open stream: No such file or directory
Pourtant j’ai bien importer TOUS les models via le fichier cronconfig.php… Je sais qu’il est appelé puisqu’une erreur dans celui-ci entraine une erreur.
Comment faire ? J’ai trouvé un post similaire sur stackoverflow mais il n’y a pas de réponse…
Je vous remercie