注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

PHP中的uniqid在高并发下的重复问题  

2012-01-19 14:56:43|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://blog.csdn.net/lgg201/article/details/5989739

项目是一个高并发的web项目,并且会有后台进程(pcntl并发),两者都会利用uniqid去生成唯一id,今天发现一个bug,在高并发情况下,uniqid可能产生重复输出。

 

以下是测试代码:

  1. <?php  
  2. function new_child($func_name) {  
  3.     $args = func_get_args();  
  4.     unset($args[0]);  
  5.     $pid = pcntl_fork();  
  6.     if($pid == 0) {  
  7.         function_exists($func_nameand exit(call_user_func_array($func_name$args)) or exit(-1);  
  8.     } else if($pid == -1) {  
  9.         echo "Couldn’t create child process.";  
  10.     } else {  
  11.         return $pid;  
  12.     }     
  13. }  
  14. function generate() {  
  15.     $t = array();  
  16.     while($i ++ < 10) {  
  17.         $uid = uniqid(true)."/n";  
  18.         array_push($t$uid);  
  19.     }     
  20.     sort($t);  
  21.     while(-- $i >=0) {  
  22.         echo array_shift($t);  
  23.     }     
  24. }  
  25. while($i ++ < 1000) {  
  26.     new_child(generate);  
  27. }  
  28. ?>  

<?php function new_child($func_name) { $args = func_get_args(); unset($args[0]); $pid = pcntl_fork(); if($pid == 0) { function_exists($func_name) and exit(call_user_func_array($func_name, $args)) or exit(-1); } else if($pid == -1) { echo "Couldn’t create child process."; } else { return $pid; } } function generate() { $t = array(); while($i ++ < 10) { $uid = uniqid(true)."/n"; array_push($t, $uid); } sort($t); while(-- $i >=0) { echo array_shift($t); } } while($i ++ < 1000) { new_child(generate); } ?>

 

测试方法: 命令行运行此程序,重定向输出到文件,然后利用下面程序检查重复:

  1. <?php  
  2. $f = file("tttttt");  
  3. $f = array_count_values($f);  
  4. foreach($f as $k => $c) if($c > 1) echo $c.'_'.$k;  
  5. ?>  

<?php $f = file("tttttt"); $f = array_count_values($f); foreach($f as $k => $c) if($c > 1) echo $c.'_'.$k; ?>

 

解决方法: 我们现在是在uniqid后又加了rand(1, 10000),在1000并发,每进程10次uniqid的情况下,再没有产生重复。

  评论这张
 
阅读(476)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017