接着上一篇《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字段,表示每十分钟执行一次。