坑
以下针对PHP的Memcached扩展
- increment/decrement/touch方法必须使用binary protocol($_mc->setOption(Memcached::OPT_BINARY_PROTOCOL,true)),且连续执行两个请求必须先关闭之前的才可以
- $expiry参数可以是UNIX 时间戳也可以是当前秒数,秒数大于30天会被认为是时间戳,要设置用不超时可以设为0
- 启用binary protocol后increment/decrement的返回值可能类似1 15415 a2d1,←注意是类似这样的,没关系加个intval就行了
- 看php.org文档的时候下面的用户留言比上面的有用得多
强迫症专用PV统计
强迫症认为PV统计漏掉一个IP就会浑身难受
在需要统计的页面的PHP中嵌入一下代码
1 2 3 4 5 6 7 8 9 |
<?php $visiter_key = "visitor_".$newsid."_".get_ip(); $pv_key = "pv_".$newsid; $new_pv_cnt = 0; if(!mc_get($visiter_key)){ mc_set($visiter_key, $expire=3600); mc_touch($pv_key, $expire=600);//renew pv stat for 10min, no matter fail or not $new_pv_cnt = mc_incr($pv_key, $offset=1, $init=1, $expire=600); } |
每个ip一小时内访问相同页面只计一次;注意要先touch再increment,因为increment并不会增加超时时间,如果增加了还没被读就超时就杯具了;反之如果key不存在touch一下也不会怀孕;每当一个新用户访问,增加生命值10min
cron定时入库
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php foreach(mc_getallkeys() as $_ => $key){ if(substr($key, 0, 10) == 'detail_pv_'){//访问量 $cnt = intval(mc_get($key)); if($cnt >0){ mc_decr($key, $offset=$cnt, $init=0, $expire=600);//10 min //mc_delete($key); $newsid = explode('_', $key)[2]; ##run sql here } } } |
注意这里不能用delete,因为delete可能会使数据丢失,但是decrement就没关系了