600多万用户密码使用次数统计分析程序
我已经将600多万用户入库,所以从数据库获取原始数据。
如果没有导入,也可以从文本直接分析出数据。
每1万条数据保存一份序列化文件,然后再将这些文件合并成最终的文件。
再将这些数据保存成sql语句。
最后采用mysql命令,将这些数据导入到数据库中。
1 <?php 2 header("content-type:text/html; charset=utf-8"); 3 $path = dirname(realpath(__FILE__)); 4 $conn = mysql_connect('localhost', 'root', 'password') or die("Could not connect: " . mysql_error()); 5 mysql_select_db("database"); 6 mysql_query("set names utf8"); 7 8 set_time_limit(0); 9 $limit = 10000; 10 for($i=0; $i<643; $i++){ 11 $file = $path . '/data/' . $i . '.ini'; 12 if(is_file($file)){ 13 continue; 14 } 15 16 $start = $limit * $i; 17 $sql = "SELECT * FROM table limit {$start}, {$limit}"; 18 $rs = mysql_query($sql); 19 $password = array(); 20 while($row = mysql_fetch_array($rs, MYSQL_ASSOC)){ 21 $pass = $row["password"]; 22 if(!isset($password[$pass])){ 23 $password[$pass] = 0; 24 } 25 $password[$pass]++; 26 } 27 echo $i, chr(10); 28 file_put_contents($file, serialize($password)); 29 } 30 31 ini_set('memory_limit', '1024M'); 32 $passes = array(); 33 for($i=0; $i<643; $i++){ 34 $file = $path . '/data/' . $i . '.ini'; 35 if(!is_file($file)){ 36 continue; 37 } 38 $pass = unserialize(file_get_contents($file)); 39 foreach($pass as $pwd => $num){ 40 if(!isset($passes[$pwd])){ 41 $passes[$pwd] = $num; 42 } 43 else{ 44 $passes[$pwd] += $num; 45 } 46 } 47 echo $i; 48 echo chr(10); 49 } 50 51 $fw = fopen($path . "/pass.sql", "w"); 52 $i = 0; 53 foreach($passes as $pwd => $num){ 54 $str = ''; 55 $pwd = str_replace('\'', '\'\'', $pwd); 56 $pwd = str_replace('\\', '\\\\', $pwd); 57 if($i % 2000 == 0){ 58 if($i !== 0)$str = ';'.chr(10); 59 $str .= 'INSERT INTO `pwd`(`p`,`n`) VALUES(\''.$pwd.'\',\''.$num.'\')'; 60 } 61 else{ 62 $str .= ',(\''.$pwd.'\',\''.$num.'\')'; 63 } 64 fwrite($fw, $str); 65 if($i % 10000 == 0) echo $i.chr(10); 66 $i++; 67 } 68 fclose($fw); 69 echo "create insert sql success\n"; 70 ?>