一个脚本引发的思索

198 阅读2分钟

前两天老大让导数据,不假思索的写了个全部读取数据并写入文件的脚本,本以为应付过去,领导指出问题所在线上数据说有有八百多万数据,这样写服务器会宕机!

后来根据老大思路想了下可以用分页原理,又对脚本改了一下加上了分页,源码如些:

<?php

     class db

     {

         private static $dbcon=false;

      private function __construct()

       { $dbcon=@mysql_connect("127.0.0.1","root","");                                                                 mysql_select_db("sport_vote",$dbcon) or die("mysql_connect error"); 

             mysql_query("set names utf8"); 

       } 

    public static function getIntance()

    { if(self::$dbcon==false){ self::$dbcon=new self; }

        return self::$dbcon; 

     } 

 //执行语句 

 public function query($sql)

{ $query=mysql_query($sql); 

 return $query;

 } 

 //获取多条数据,二维数组

 public function getAll($sql)

{ //var_dump($sql); 

 $queryRes=$this->query($sql); 

 $list=array(); 

 while ($r = mysql_fetch_assoc($queryRes))

 {

      $list[]=$r;

 } 

     return $list;

 } 

 public function getOne($sql)

    $query=$this->query($sql); 

    return mysql_result($query,0);

 }

 public function insert($table,$data)

    foreach($data as $kt=>$vale)

     {

    $new_arr[]= $vale[0]; 

  } 

   $new_arr = array_unique($new_arr);

     $v_str=''; 

    foreach($new_arr as $key=>$v) 

     {            

               if(empty($v))  { 

                    die("error");

                  } 

                 $v_str.="('$v'),";

     } 

        $v_str =trim($v_str,','); 

        $sql="insert into $table (unique_id) values $v_str"; 

       $this->query($sql); 

   }

}


set_time_limit(0); 

 // 实例化操作类 

$db = db::getIntance();

 //获取总记录 $count = 0; 

$sql = "select count(id) from sport_vote_record";

 $countRes = $db->getOne($sql); 

 if ($countRes > 0) { $count = $countRes; } else { exit('没有数据'); }

// 分页获取记录 

 $limit = 5000; 

$pages = ceil($count/$limit); 

$offset = 0;

//定义容器

$IpData =[];

for ($i=1; $i<= $pages; $i++) 

      $sqlList = 'select unique_id from sport_vote_record '; 

       $offset = ($i - 1)* $limit; 

      $limits = " limit {$offset} ,{$limit}";

       $sqlList .= $limits; //var_dump( $sqlList);die; 

      // 获取数据 

     $result = $db->getAll($sqlList);

      foreach($result as $k=>$v)

       { //var_dump($v);die; 

          //正则匹配字符串中的ip地址

          $pattern = '/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/';  

           preg_match($pattern,$v['unique_id'],$out);

          if(!empty($out)){ $IpData[] = $out; } }

         //插入数据库,因为数据量过大,采取读取多少数据,插入多少数据,分批插入

          $db->insert('sport_vote_tem', $IpData);

         //此处是关键,应该每次把数组置空,比如第一次是[1,2]第二次是[3,4,5]但是如果不置空          的话第二次的数据会是[1,2,3,4,5]数据会重复,导致数据不准确,这也是老是报内存溢出         的原因所在 

          $IpData = [];

        }

 }

否则会出现这个错误


现在跟高级的比最欠缺的就是解决问题的能力,提升能力和经验