php提交内容不重复,跪求!PHP怎么做到多线程的情况下不重复提交,不重复插入数据?...

业务逻辑:用户进行投票,投票之后写入记录;投票成功后更改用户状态,不得再投票。直接通过postman测试接口是没问题的,数据都正常。但是只要通过多进程脚本运行测试的话,写入记录会增多。目前想到的解决方案:使用redis有序集合,使用时间戳毫秒写入获取第一个再做对比。简单来说,就是在毫秒维度进行做并发处理,但是感觉如果更高并发的话,应该也会出问题。使用队列服务处理。投票代码:$uid=Token::getCurrentUid();$codeNum=Token::getCurrentTokenVar('codeNum');//并发处理$redis=Redis::getRedisConn();$key=RedisKeyNameLibrary::USER_VOTE.$codeNum;$score=array_sum(explode('',microtime()));$value=build_rand_str(32).':'.$uid;$redis->zRemRangeByScore($key,0,time()-1);//清除1秒前的集合$redis->zAdd($key,$score,$value);$zRangeArr=$redis->zRange($key,0,-1);if($zRangeArr[0]<>$value)returnreturnError('提交失敗,請重新提交!',30002);$tran=$this->db();$tran->startTrans();try{//根据ID获取对应模型$model=self::get($uid);$data=array_merge($model->toArray(),$data);//验证$validate=newCodeValidate();$result=$validate->check($data,[],'vote');if(!$result)returnreturnError($validate->getError(),30001);$errorMsg=returnError('提交失敗,請重新提交!',30002);//更改为已投票$status=$model->data($data)->allowField(true)->save(['status'=>self::STATUS_1]);//保存成功后追加投票记录if($status!==false){$saveData=[];$models=User::all(array_map('intval',$data['user_ids']))->all();foreach($modelsas$k=>$v)array_push($saveData,['code_num'=>$data['code_num'],'uid'=>$v->data['id'],'name'=>$v->data['name'],'group_id'=>$v->data['group_id']]);$model->logs()->saveAll($saveData);$tran->commit();returnreturnSuccess();}return$errorMsg;}catch(Exception$e){$tran->rollback();return$errorMsg;}以下是多进程测试投票接口的脚本:for($i=0;$i<6;$i++){$pid=pcntl_fork();if($pid==-1){die("couldnotfork");}elseif($pid){echo"I'mtheParent$i\n";}else{$token='123123';$url='http://api.com/user';$query='user_ids[]=1&user_ids[]=39&user_ids[]=19&user_ids[]=30';$command='curl-H"token:'.$token.'"-XPOST-d"'.$query.'"'.$url;//子进程处理$res=system($command);file_put_contents($i.'_work.log',var_export($res,true));exit();//一定要注意退出子进程,否则pcntl_fork()会被子进程再fork,带来处理上的影响。}}//等待子进程执行结束while(pcntl_waitpid(0,$status)!=-1){$status=pcntl_wexitstatus($status);echo"Child$statuscompleted\n";}想问问,除了以上解决方案之外,还有没有别的解决方案?(最好不需要启动别的服务之类的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值