坑
以下針對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就沒關係了