前两天老大让导数据,不假思索的写了个全部读取数据并写入文件的脚本,本以为应付过去,领导指出问题所在线上数据说有有八百多万数据,这样写服务器会宕机!
后来根据老大思路想了下可以用分页原理,又对脚本改了一下加上了分页,源码如些:
<?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 = [];
}
}
否则会出现这个错误
现在跟高级的比最欠缺的就是解决问题的能力,提升能力和经验