Консольное приложение в yii не включает модель AR
Я хочу запланировать запуск консольной команды в yii. Я написал php-скрипт и попробовал его в веб-приложении - работает хорошо. Тем не менее, когда я помещаю это как консольную команду , cron отправляет следующее сообщение:
PHP Error[2]: include(User.php): failed to open stream: No such file or directory
in file /home/srv50213/htdocs/framework/YiiBase.php at line 427
#0 /home/srv50213/htdocs/framework/YiiBase.php(427): autoload()
#1 unknown(0): autoload()
#2 /home/srv50213/htdocs/doc/protected/commands/ReportMailerCommand.php(20): spl_autoload_call()
#3 unknown(0): ReportMailerCommand->actionIndex2()
#4 /home/srv50213/htdocs/framework/console/CConsoleCommand.php(172): ReflectionMethod->invokeArgs()
#5 /home/srv50213/htdocs/framework/console/CConsoleCommandRunner.php(71): ReportMailerCommand->run()
#6 /home/srv50213/htdocs/framework/console/CConsoleApplication.php(92): CConsoleCommandRunner->run()
#7 /home/srv50213/htdocs/framework/base/CApplication.php(180): CConsoleApplication->processRequest()
#8 /home/srv50213/htdocs/framework/yiic.php(33): CConsoleApplication->run()
#9 /home/srv50213/htdocs/doc/protected/yiic.php(8): require_once()
Похоже, что функция autoload() работает неправильно. Для консольного приложения $config я использую config/console.php где я вставил настройку бд (из main.php и настройки пользователя).
'components'=>array(
'db'=>array(
// настройки для конфигурации
'connectionString' =>
'mysql:host=localhost;dbname=xxx',
'emulatePrepare' => true,
'schemaCachingDuration' => 3600,
'username' => 'xxx',
'password' => 'xxx',
'charset' => 'utf8',
'tablePrefix' => 'yiiapp_',
'class' => 'CDbConnection'
),
'user'=>array(
'class' => 'WebUser',
//'class' => 'application.components.User',
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
)
Сценарий - это что-то вроде. вот так:
public function actionIndex2($args)
{
$users = User::model()->findAllByPk( array(177) );
foreach($users as $user)
{
$query = "SELECT e.id, e.Subject
FROM `yiiapp_doc_events` AS e
LEFT JOIN `yiiapp_doc_event_users` AS u ON e.id = u.eventId
WHERE e.StatusId NOT IN (5,7)
AND u.userId = {$user->id}
GROUP BY e.id";
$queryResult = Yii::app()->db->createCommand($query)->queryAll();
if ($queryResult)
{
foreach($queryResult as $res)
{
$i++;
$link = Yii::app()->createAbsoluteUrl('docEvents/update', array('id'=>$res['id']));
$table .= "<tr><td> {$i} </td><td> <a href='{$link}'>{$res['id']}</a> </td><td> <a href='{$link}'>{$res['Subject']}</a> </td></tr>";
}
//echo $table . '</table>';
$content= " $table . '</table>';
mail($user->email, "Report (". $i . ')', $content, 'Content-type: text/html');
}
}
}
Что не так, как исправить это?
Обновление
Как предложил Крис я добавил параметр импорта в массив конфигурации.
Теперь эта проблема исчезла. Тем не менее, поскольку я призываю к Yii::app()->createAbsoluteUrl()
, другое расстраивает Undefined index: SERVER_NAME
:
PHP Error[8]: Undefined index: SERVER_NAME
in file /home/srv50213/htdocs/framework/web/CHttpRequest.php at line 317
#0 /home/srv50213/htdocs/framework/base/CApplication.php(560): CHttpRequest->getHostInfo()
#1 /home/srv50213/htdocs/doc/protected/commands/ReportMailerCommand.php(39): CConsoleApplication->createAbsoluteUrl()
...
Каково решение?
Решение
После некоторого поиска в Google для createAbsoluteUrl в консольной команде я нашел полезные темы 1 и 2.
Первое дает это средство - добавьте следующее в config/console.php :
'components' => array(
'request' => array(
'hostInfo' => 'https://domainname.com',
'baseUrl' => '',
'scriptUrl' => '',
),
...
)
И второй способ аналогичен:
'components' => array(
'urlManager' => array(
'baseUrl' => 'https://domain.com'
)
)
1 answers
Правильно ли вы определили импорт? Я думаю, что это не по умолчанию в конфигурации консоли. Поместите в него что-то вроде этого:
'import' => array(
'application.models.*',
),
Изменить: к вашему обновлению:
Вы не можете использовать функцию createUrl()
в консольном приложении. Как вы уже обнаружили, он использует $_SERVER['SERVER_NAME']
, который не установлен, так как консольное приложение всегда запускается без сервера, непосредственно с помощью командной строки php.