waverju 发表于 2013-1-28 09:18:05

6月梦想活动总结

1.
在大PV UV 和并发面前 往往平常正常工作的程序 都会变得不正常了 会出现未知的异常。在这次活动中遇到了类似的问题。 比如:大量并发造成数据库无故插入失败 为了保证 完整性 那么我们采用了 事务的解决方法 保证成功和失败都完整。另外对失败的进行异常捕捉写入到异常日志表 然后采用我们自己的计划任务进行跑 保证数据不丢失。

#增加事务防止高并发异常
$this->db = get_db();
$this->db->beginTransaction(); //开始事务
try{
$this->do_dream($orders);//执行处理程序 包括多个数据表的操作 逻辑处理
$this->db->commit(); //成功的话 提交事务
} catch(Exception $e){
$this->db->rollBack();//异常则回滚之前的操作
if($e->getCode()!=1){ //方法里 可以抛出自己预测到的异常 比如定义为1则不去记录
    $this->insert_log($orders->order_id,$e->getMessage());//否则记录异常日志表
      }
}



2.
在大并发情况下 程序的唯一判断是不会起作用的 因为不是顺序执行的比如淘宝接口同时发送多个交易状态到这边并发执行的话 会造成数据库生成同样的几条数据 绕过了程序唯一判断那么解决这个的唯一办法就是 数据库对应的字段设置为唯一索引(包括 单唯一 和联合唯一)
UNIQUE KEY `uid` (`uid`,`order_id`)

3.对于投票的防范可以采用 图片验证码+手机发送短信息验证+次数限制+手机归属地限制(IP对应的地址 http://www.12580ba.com/plus/ip.php 投票的手机必须是手机归属地的地址 http://www.youdao.com/smartresult-xml/search.s?type=mobile&q= )

#根据手机号码查询接口获取手机归属地存入数据库表
if($mobile_num){
    $api_url ="http://www.youdao.com/smartresult-xml/search.s?type=mobile&q=".$mobile_num;
    $result_str = @file_get_contents($api_url);
}
$xml_obj= simplexml_load_string($result_str);
$str_city = $xml_obj->product->location;
$city_array = explode(' ',$str_city);
if($city_array){
$city =$city_array;
}else{
$city =$city_array;
}
将CITY存入数据库 然后IP来投票的时候取得IP的城市 对比数据库的城市 (不过这个误差大 不精确)
页: [1]
查看完整版本: 6月梦想活动总结