【问题标题】:DB connection does not work in Yii cronjob数据库连接在 Yii cronjob 中不起作用
【发布时间】:2013-10-31 01:02:51
【问题描述】:

我遵循 Yii cron setup instruction 通过调用命令配置作业(在 CLI(控制台)模式下运行 PHP)。 cron 作业按设计工作,但是当我处理 AR 模型或查询 SQL 时,脚本/命令不起作用。

我已经在 config/cron.php 中设置了数据库连接:

...
'components'=>array(
    ...
    'db'=>array(
        'connectionString' => 'mysql:host=localhost;dbname=blogandt_yiiapp',
        //mysql:host=127.0.0.1;port=3306;
        'emulatePrepare' => true,
        'username' => '...',
        'password' => '..',
        'charset' => 'utf8',
        'tablePrefix' => 'yiiapp_', 
        'class'         => 'CDbConnection'   
    ),
 ), 

TestCommand.php:

<?php
class TestCommand extends CConsoleCommand {
    public function run($args) {        
    $dateObj = new DateTime('NOW');  //date("Y-m-d");       
    $fromTime = date_format($dateObj, "Y-m-d H:m:i");
            date_modify($dateObj, '+5 days');   
    $toTime = date_format($dateObj, "Y-m-d H:m:i"); 
    $message = "Time span is from {$fromTime} to {$toTime} ";
    mail('xyz@gmail.com', 'TestCommand run', $message, '');
    
    $criteria = new CDbCriteria;
    $criteria->addBetweenCondition('time', $fromTime, $toTime);  
    $notification = DocEventNotification::model()->findAll($criteria);
            // OR
    //$query = 'SELECT n.UserId, n.EventId FROM yiiapp_doc_event_notification n';
    //$query .= "WHERE (n.time BETWEEN '{$fromTime}' AND '{$toTime}') AND n.turn = '1' ";
    //$rows = Yii::app()->db->createCommand($query)->queryAll();
    mail('xyz@gmail.com', 'TestCommand after DB query', $message, '');
      }
  } ?>

当我不通过 AR 或直接发送电子邮件时,我不处理数据库,而使用数据库查询 - 不是。我已经在控制器中检查了这些 AR 查询——它们工作正常。怎么了?

编辑

实际上,当通过$rows = Yii::app()-&gt;db-&gt;createCommand($query)-&gt;queryAll(); 查询时,第一封邮件正在发送,而第二封邮件(在 DB 查询之后)没有发送。

编辑2

我记下了cron.log 的一个sn-p。 PDO 对象似乎有问题。

 2013/10/21 23:25:00 [error] [php] include(PDO.php): failed to open stream: No such file or       directory (/home/blogandt/domains/blogandtraffic.com/public_html/framework/YiiBase.php:427)

我在配置 Yii 时没有包含 PDO 支持。 有什么办法?

【问题讨论】:

  • 尝试手动执行看看错误!
  • 如果共享主机不授予 shell 访问权限,我如何执行命令?
  • 可能与DocEventNotification模型类有关
  • 正如我在问题中所说的,我尝试从控制器/动作中的 DocEventNotification 模型类中获取记录并成功。 (相同的代码)。所以,我无法找出问题......
  • 您可以通过这种方式在某些控制器中尝试执行命令:$com = TestCommand; $com-&gt;run(array());。或者,您可能会看到 cron 脚本的日志

标签: php mysql database yii cron


【解决方案1】:

这可能是连接问题。在 n 之后缺少一个空格

$query = 'SELECT n.UserId, n.EventId FROM yiiapp_doc_event_notification n ';
$query .= "WHERE (n.time BETWEEN '{$fromTime}' AND '{$toTime}') AND n.turn = '1' ";

试着告诉我们发生了什么。

【讨论】:

  • 我已经完成了,但没有结果。实际上在此之前我已经评论了第二行$query .= ...
猜你喜欢
  • 2011-10-05
  • 2021-07-24
  • 2016-01-31
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2013-05-09
  • 2014-12-27
  • 2014-05-20
相关资源
最近更新 更多