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