PHP code example of mr5 / counter-rank
1. Go to this page and download the library: Download mr5/counter-rank library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
mr5 / counter-rank example snippets
use mr5\CounterRank\CounterRank;
// 命名空间 namespace 用于区分不同的项目。
// 分组名是一类 items 的分组。
// 比如要统计的是文章,则分组名可以是 articles,评论的分组名可以是 comments。
$counterRank = new CounterRank(
'redis_host',
'redis_port',
'namespace',
'分组名'
);
// 创建一个item,create 方法可以接收一个数字作为默认值,留空则为0。
// 下面的`900310`可以看做是文章 ID、评论 ID 等等。
$counterRank->create('900310', 0);
// 删除一个分组,`articles` 是分组名
$counterRank->deleteGroup('articles');
// 删除一个 item
$counterRank->delete('900310');
// 递增指定键名的值,如为负数则为递减。
// 这里对 `900310` 这篇文章递增了 1
$counterRank->increase('900310', 1);
// 递减
$counterRank->increase('900310', -1);
// 倒序排序,最多 10 个。
$counterRank->rank(10, 'desc');
// 正序排序,最多 10 个
$counterRank->rank(10, 'asc');
// 最高的 10 个
$counterRank->top10();
// 最低的 10 个
$counterRank->down10();
// 设置当操作一个不存在的 keys 时的处理闭包。
// 该闭包将接收两个参数,第一个参数是 key ,
// 第二个参数是当前 CounterRank 对象。
// 如修复后该 key 可以操作时返回 true,否则返回 false。
// 可以用于自动创建 item
$counterRank->setFixMiss(function($key, CounterRank $counterRank) {
return $counterRank->create($key, 0) > 0;
});
use mr5\CounterRank\JSClientHandler;
/**
*
* JS 客户端控制器示例,请根据自己使用的框架以及需求进行修改
*
*/
class ExampleController extends Controller
{
// 配置客户端的 token,键是分组名,值是 token 值。每个分组都必须指定,未指定的则不允许通过 JS Client 访问
protected $tokens = array(
'articles' => '1234567890JQK',
'comments' => 'abcdefghijk'
);
protected $redis_host = 'localhost';
protected $redis_port = 6379;
// 命名空间,建议使用项目名称
protected $namespace = 'project_name';
// 递增的步长,如设置成负数,则 increase 方法执行的是递减
protected $increaseStepSize = 1;
// @var JSClientHandler|null
protected $handlerInstance = null;
public function __construct()
{
$this->handlerInstance = new JSClientHandler(
$this->redis_host,
$this->redis_port,
$this->namespace,
$this->tokens,
$this->increaseStepSize
);
}
// 读取
public function getAction()
{
$this->handlerInstance->handleGet(
$_REQUEST['token'],
$_REQUEST['group'],
$_REQUEST['keys'],
$_REQUEST['callback']
);
}
// 递增
public function increaseAction()
{
$this->handlerInstance->handleIncrease(
$_REQUEST['token'],
$_REQUEST['group'],
$_REQUEST['keys'],
$_REQUEST['callback']
);
}
// 排名
public function rankAction()
{
$this->handlerInstance->handleRank(
$_REQUEST['token'],
$_REQUEST['group'],
$_REQUEST['type'],
$_REQUEST['limit'],
$_REQUEST['callback']
);
}
// 最高的十个数据
public function top10Action()
{
$this->handlerInstance->handleTop10(
$_REQUEST['token'],
$_REQUEST['group'],
$_REQUEST['callback']
);
}
// 最低的十个数据
public function down10Action()
{
$this->handlerInstance->handleDown10(
$_REQUEST['token'],
$_REQUEST['group'],
$_REQUEST['callback']
);
}
}
$jsClientHandler->setTokenVerifier(function (
$operation, // 操作名
$userToken, // 客户端提交的 token
$token, // 服务器端约定的 token
$group, // 分组名
$keys) {
$str = $token.$group;
if($keys) {
$str .= $keys;
}
return md5($str) == $userToken;
});
// 注意:本操作可能耗时很长,请在命令行下执行并根据实际情况加入操作系统计划任务,而不是通过 web 请求执行
$counterRank = new CounterRank(
'redis_host',
'redis_port',
'namespace',
'分组名'
);
$conn = mysql_connect('localhost', 'username', 'password');
mysql_select_db('dbname', $conn);
mysql_set_charset('utf8', $conn);
foreach($counterRank->getIterator() as $items) {
$values = '';
foreach($items AS $post_id=>$heat) {
if($values != '') {
$values .= ',';
}
$values .= "({$post_id}, {$heat})";
}
mysql_query(
"INSERT INTO `posts`(post_id, heat) VALUES {$values} ON DUPLICATE KEY UPDATE heat=values(heat);",
$conn
);
});
xml
<php>
<!-- Redis -->
<const name="REDIS_SERVER_HOST" value="127.0.0.1" />
<const name="REDIS_SERVER_PORT" value="6379" />
<const name="REDIS_NAMESPACE" value="__unitTest___" />
</php>