Yii2博客实战教程——用crontab和congsole控制器同步多说评论

接着上一篇《Yii2博客实战教程——多说评论的整合》,我们发现一个问题,就是如果采用第三方的评论插件,博客列表页面的评论数量如何获取呢?不要着急,接下来我们就一步步教大家如何同步多少的评论数据。

1.首先查看多说提供的api文档,我们发现它提供了获取文章的评论数的api具体请看http://dev.duoshuo.com/docs/50615732a834c63c56004257 ,我们可以测试下直接在浏览器中访问api地址 http://api.duoshuo.com/threads/counts.json?short_name=linhongxu&threads=201 这样就会返回你如下的json信息

{
  "response": {
    "201": {
      "thread_id": "6298950763527799554",
      "channel_key": null,
      "thread_key": "201",
      "reposts": 0,
      "views": 0,
      "likes": 0,
      "dislikes": 0,
      "comments": 1
    }
  },
  "options": {
    "comments_zero": "暂无评论",
    "comments_one": "1条评论",
    "comments_multiple": "{num}条评论"
  },
  "code": 0
}

其中201里面的comments就是我们想要得到的数据,201帖子的评论数量。那么简单了,我们只要把这个数据同步回我们的数据库就可以了。

这里我们使用YII2 为我们提供的console项目模板,进行开发,创建一个可以从命令行执行的程序。

首先在console中创建一个继承自\yii\console\Controller的类,我们叫它TaskController里面有个action方法叫actionGetcomments

class TaskController extends \yii\console\Controller
{ 
    public function actionGetcomments()
    {}
}

里面的逻辑非常简单,获取所有的帖子id值,传给多说api当参数,获取到返回json,然后update数据库,将数据写回数据库。

首先是获取所有id的值:

echo "Getcommets...\n";
        $allIds = (new \yii\db\Query())
               ->select(['ids'=>' GROUP_CONCAT(cast(`id` as char(10)) SEPARATOR \',\') '])
               ->from('post')
               ->one();
        $ids = $allIds['ids'];
echo "get ids from db:\n".$ids;

然后调研api获取json:

$url='http://api.duoshuo.com/threads/counts.json?short_name=linhongxu&threads='.$ids;
echo "send url:\n".$url;
$json = file_get_contents($url); 
$array = json_decode($json);

然后写回数据库:

       $connection = \Yii::$app->db;
        if( $array->code == 0)
        {
            $sql = "UPDATE post SET comments_count = CASE id ";
            foreach ($array->response as $id => $data) {
                $sql .= sprintf("WHEN %d THEN %d ", $id, $data->comments);
            }
            $sql .= "END WHERE id IN ($ids)";
            echo $sql;
        }
        $transaction = Tag::getDb()->beginTransaction();
        try {
            $connection->createCommand($sql)->execute();
            $transaction->commit();
            echo "transaction commited  ...\n";
        } catch(\Exception $e) {
            $transaction->rollBack();
            echo $e;
            echo "transaction commited  failed,rollback ...\n";
        }

这样就完成了整个业务逻辑。我们去congsole上运行下代码

yii task/getcomments

这样就可以在执行我们的代码了,简单吧。

但是我们不能每次都用手动去执行这段代码获取数据吧,这个时候linux的cronTab任务就派上用处了,我们可以使用定时任务,自动的执行脚本程序。

在linux中执行命令crontab -e进入crontab的编辑模式,加入下面的代码

*/5 * * * * /usr/local/php/bin/php yii所在目录/yii task/getcomments

这样我们就可以使用crontab去调用php执行task控制器里面的getcomments方法了。crontab的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

本文由 Leo's Blog 创作,采用 署名-非商业性使用 2.5 中国大陆 进行许可。
如需转载、引用请署名作者且注明文章出处。
2016年09月29日 2740 浏览 评论 YII2 crontab 定时任务
上一篇:Yii2博客实战教程——多说评论的整合 | 下一篇:Yii2博客实战教程——微信扫码登陆的实现