前一段时间因为要开发一个新项目,需要一个ip库,由于公司原本无这样一个库,所以急需从文件中匹配ip地址然后存库。下面是我下的一段程序,可能效率不是很高,代码也没有做过多的优化,有些地方比较繁琐,但这样以后脏数据相对来说少点,但或多或少还是存在一定的脏数据。但是这个文件有40多行,我采取的办法是按行数将这个相对来说很大的文件拆分是N多很小的文件分布式分析入库的。当然你也可以通过多进程处理。一个问题有很多解决办法,我分享一下我的想法。当然如果您有更好的办法请多多指正,笔者虚心求教,还有我下面贴出的代码您也可以去优化,然后提出您的优化建议,我们一起探讨,共同进步。

    我当时采用的是浏览器运行php文件来执行的,在这里我建议应该在linux环境下采用php命令行执行,这样效率会更高,而且不存在超时的问题。

  1. <?php
  2. /*
  3.     *Author:马荣财
  4.     *date:2011/8/2 14:25:28
  5.     *
  6.     *目的:正则匹配ip文件列表导入数据库
  7.     *@param $filename ip列表文件全路径包括目录
  8.     *
  9.     */
  10. /*
  11.     *分析了一下文件发现主要有一下几种格式
  12.     *A:  **省            如甘肃省
  13.     *B:  **市**区     如北京市海淀区或如浙江省宁波市北仑区
  14.     *C:  ****大学     如清华大学
  15.     *D:  ****市 如新疆,宁夏,西藏,内蒙古**市
  16.     *E:  剩下的为一类
  17.     */
  18. //set_time_limit(0);
  19. ini_set('max_execution_time''3000');
  20. $conn = mysql_connect('localhost','root',''or die('MYSQL 连接错误!');
  21. mysql_query("set names utf8");
  22. mysql_select_db('test',$conn);
  23. $result = mysql_query('select `cid`,`pid`,`name` from `tbl_city`');
  24. $citys = array();
  25. while($row=mysql_fetch_array($result)) {
  26. $citys[$row['name']] = $row;
  27. }
  28. function parseAndImport($filename,$citys) {
  29. //将ip文件列表读入一个数组
  30. $fileArr = file($filename);
  31. //分别定义了国家、省份、城市、描述、省份id、城市id、ip段(1,2)
  32. $country ='';
  33. $province = '';
  34. $city ='';
  35. $ser = '';
  36. $cid = '';
  37. $pid = '';
  38. $ip1 ='';
  39. $ip2 = '';
  40. //定义一个计数器
  41. $i=0;
  42. $sql = '';
  43. foreach($fileArr as $key=>$lineText) {
  44. if(preg_match("|(\d+\.\d+\.\d+\.\d+) +(\d+\.\d+\.\d+\.\d+) +(.*)|",$lineText,$lineArr)) {
  45. //用空格切割匹配的与城市有关的信息
  46. $dataArrexplode(' ',$lineArr[3]);
  47. $ser = $lineArr[3];
  48. $cityStr = $dataArr[0];
  49. //把ip装换成整数形式
  50. $ip1 = sprintf("%u"ip2long($lineArr[1]));
  51. $ip1 = addslashes($ip1);
  52. $ip2 = sprintf("%u"ip2long($lineArr[2]));
  53. $ip2 = addslashes($ip2);
  54. echo $ip2;exit;
  55. //先查找A类型的数据
  56. if(preg_match("|(.*)省$|",$cityStr,$cityArr)) {
  57. $country = '中国';
  58. $cityArrlen = count($cityArr);
  59. if($cityArrlen>0) {
  60. $province = $cityArr[1];
  61. $city ='';
  62. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  63. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  64. else {
  65. $province ='';
  66. $city = '';
  67. }
  68. delLine($filename,$lineText);
  69. }
  70. //查找B类型的数据
  71. elseif(preg_match("|(.*?)市(.*)|",$cityStr,$cityArr) || preg_match("|(.*?)州(.*)|",$cityStr,$cityArr)) {
  72. $country = '中国';
  73. $cityArrlen = count($cityArr);
  74. if($cityArrlen>0) {
  75. $len=mb_strpos($cityArr[1],'省');
  76. if($len>0) {
  77. $pcArr = explode('省',$cityArr[1]);
  78. $province=$pcArr[0];
  79. $city=$pcArr[1];
  80. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  81. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  82. else {
  83. $province = $cityArr[1];
  84. $areaLen = mb_strpos($cityArr[2],'区');
  85. if($areaLen>0) {
  86. $aArr = explode($cityArr[2],'区');
  87. $city = $aArr[0];
  88. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  89. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  90. else {
  91. $province = $cityArr[1];
  92. $city ='';
  93. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  94. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  95. }
  96. }
  97. else {
  98. $province ='';
  99. $city = '';
  100. }
  101. delLine($filename,$lineText);
  102. }
  103. //查找C类型的数据
  104. elseif(preg_match("|(.*)大学(.*)|",$cityStr,$cityArr) || preg_match("|(.*)学院(.*)|",$cityStr,$cityArr)) {
  105. //参阅附件,这块比较繁琐
  106. }
  107. //查找D类型的数据
  108. elseif(preg_match("|^内蒙古(.*)|",$cityStr,$cityArr)) {
  109. $cityArrlen = count($cityArr);
  110. $country = '中国';
  111. $province = '内蒙古';
  112. if($cityArrlen>0) {
  113. $len=mb_strpos($cityArr[1],'市');
  114. if($len>0) {
  115. $pcArr = explode('市',$cityArr[1]);
  116. $city=$pcArr[0];
  117. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  118. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  119. else {
  120. $city = '';
  121. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  122. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  123. }
  124. }
  125. else {
  126. $city = '';
  127. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  128. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  129. }
  130. delLine($filename,$lineText);
  131. }
  132. elseif(preg_match("|^西藏(.*)|",$cityStr,$cityArr)) {
  133. $cityArrlen = count($cityArr);
  134. $country = '中国';
  135. $province = '西藏';
  136. if($cityArrlen>0) {
  137. $len=mb_strpos($cityArr[1],'市');
  138. if($len>0) {
  139. $pcArr = explode('市',$cityArr[1]);
  140. $city=$pcArr[0];
  141. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  142. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  143. else {
  144. $city = '';
  145. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  146. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  147. }
  148. }
  149. else {
  150. $city='';
  151. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  152. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  153. }
  154. delLine($filename,$lineText);
  155. }
  156. elseif(preg_match("|^新疆(.*)|",$cityStr,$cityArr)) {
  157. $cityArrlen = count($cityArr);
  158. $country = '中国';
  159. $province = '新疆';
  160. if($cityArrlen>0) {
  161. $len=mb_strpos($cityArr[1],'市');
  162. if($len>0) {
  163. $pcArr = explode('市',$cityArr[1]);
  164. $city=$pcArr[0];
  165. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  166. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  167. else {
  168. $city = '';
  169. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  170. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  171. }
  172. }
  173. else {
  174. $city ='';
  175. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  176. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  177. }
  178. delLine($filename,$lineText);
  179. }
  180. elseif(preg_match("|^宁夏(.*)|",$cityStr,$cityArr)) {
  181. $cityArrlen = count($cityArr);
  182. $country = '中国';
  183. $province = '宁夏';
  184. if($cityArrlen>0) {
  185. $len=mb_strpos($cityArr[1],'市');
  186. if($len>0) {
  187. $pcArr = explode('市',$cityArr[1]);
  188. $city=$pcArr[0];
  189. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  190. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  191. else {
  192. $city = '';
  193. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  194. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  195. }
  196. }
  197. else {
  198. $city = '';
  199. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  200. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  201. }
  202. delLine($filename,$lineText);
  203. }
  204. elseif(preg_match("|^香港(.*)|",$cityStr,$cityArr)) {
  205. $cityArrlen = count($cityArr);
  206. $country = '中国';
  207. $province = '香港';
  208. if($cityArrlen>0) {
  209. $len=mb_strpos($cityArr[1],'市');
  210. if($len>0) {
  211. $pcArr = explode('市',$cityArr[1]);
  212. $city=$pcArr[0];
  213. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  214. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  215. else {
  216. $city = '';
  217. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  218. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  219. }
  220. }
  221. else {
  222. $city = '';
  223. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  224. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  225. }
  226. delLine($filename,$lineText);
  227. }
  228. elseif(preg_match("|^澳门(.*)|",$cityStr,$cityArr)) {
  229. $cityArrlen = count($cityArr);
  230. $country = '中国';
  231. $province = '澳门';
  232. if($cityArrlen>0) {
  233. $len=mb_strpos($cityArr[1],'市');
  234. if($len>0) {
  235. $pcArr = explode('市',$cityArr[1]);
  236. $city=$pcArr[0];
  237. $pid =empty($citys[$city]['pid']) ? '' : $citys[$city]['pid'];
  238. $cid =empty($citys[$city]['cid']) ? '' : $citys[$city]['cid'];
  239. else {
  240. $city = '';
  241. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  242. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  243. }
  244. }
  245. else {
  246. $city = '';
  247. $pid =empty($citys[$province]['pid']) ? '' : $citys[$province]['pid'];
  248. $cid =empty($citys[$province]['cid']) ? '' : $citys[$province]['cid'];
  249. }
  250. delLine($filename,$lineText);
  251. }
  252. else {
  253. $country = $cityStr;
  254. $province='';
  255. $city='';
  256. $cid = '';
  257. $pid ='';
  258. delLine($filename,$lineText);
  259. }
  260. }
  261. $i++;
  262. echo $ip2;exit;
  263. $sql = 'insert into `city_ip`(`ip1`,`ip2`,`country`,`ser`,`province_id`,`province_name`,`city_id`,`city_name`) values ("'.$ip1.'","'.$ip2.'","'.$country.'","'.$ser.'","'.$pid.'","'.$province.'","'.$cid.'","'.$city.'")';
  264. if(mysql_query($sql)) {
  265. echo $i.'<br/>';
  266. }
  267. }
  268. }
  269. function delLine($filename,$text) {
  270. $f1=fopen($filename,'r');
  271. $tmp=tempnam('e:\web\www\\','newip.txt');//建立临时文件
  272. $f2=fopen($tmp,'w');
  273. while(!feof($f1)){
  274. $line=fgets($f1);
  275. if ($line!=$textfputs($f2,$line);
  276. }
  277. fclose($f1);
  278. fclose($f2);
  279. rename($tmp,$filename);
  280. }
  281. parseAndImport('ip1.txt',$citys);
  282. ?>