/** * @author 符璨 * @desc * 从cdkey_task取出待处理的cdkey任务进行处理 * 批量生成cdkey */ public static function action_gen_cdkey() { $redis = DbConfig::getRedis('realtime_stat'); $process_id = getmypid(); //从cdkey中取出一条状态为0(未处理cdkey生成记录),并更新为1(正在处理) $mc = new PL_Db_Mongo(DbConfig::getMongodb('userlogin')); $mc->switchColl('cdkey_task'); $cdkey_task = $mc->findOne(array('status' => 0)); //没有待处理的任务 if ($cdkey_task == NULL) { return; } glog::info("[{$process_id}] gen cdkey worker started", 'cdkey'); $task_id = $cdkey_task['_id']; $mc->update(array('_id' => $task_id), array('$set' => array('status' => 1))); $pa = $cdkey_task; unset($pa['status']); $num = $pa['num']; $task_id = $cdkey_task['_id']; //根据cdkey_task的内容生成cdkey $mc->switchColl('cdkey'); while ($num--) { $pa['_id'] = model_Cdkey::genCdkey(13); $pa['task_id'] = $task_id->__toString(); //try以防有重复的cdkey try { $cdkey = $mc->insert($pa); //redis中统计当前已生成的cdkey数目 $redis->hIncrBy('cdkey_task', $task_id, 1); $redis->lpush("cdkey_{$task_id}", $pa['_id']); } catch (Exception $ex) { $exception_cnt--; $num++; glog::info("[{$process_id}] gen cdkey worker:Duplicated _id {$pa['_id']}", 'cdkey'); if (!$exception_cnt) { break; } continue; } $exception_cnt = 10; } $mc->switchColl('cdkey_task'); $mc->update(array('_id' => $task_id), array('$set' => array('status' => 2))); $redis->hDel('cdkey_task', $task_id); glog::info("[{$process_id}] gen cdkey worker completed", 'cdkey'); }