php 日志抓取入库,洪量日志入库

该博客探讨了如何高效地将大量日志数据(每个压缩文件约60M,共10个文件)快速导入数据库的问题。现有的脚本执行效率低下,作者提出了修改表类型为InnoDB并使用事务,但效果不佳。建议考虑使用LOAD DATA INFILE命令或者优化数据库索引、批量插入等方式提高效率。此外,日志按email分表策略可能导致性能瓶颈,可能需要重新评估分表策略。
摘要由CSDN通过智能技术生成

海量日志入库

日志目录下有10个日志文件,每个文件压缩后大约60M左右,文件后缀是.gz,如a.gz、b.gz等,文件中行的内容是id=2112112,email=xxx@163.com,等等其它,

id=2112112,email=xxx@163.com,等等其它,

id=2112112,email=xxx@163.com,等等其它,

id=2112112,email=xxx@163.com,等等其它,

id=2112112,email=xxx@163.com,等等其它,

id=2112112,email=xxx@163.com,等等其它,

id=2112112,email=xxx@163.com,等等其它,

现在是想把这个目录下的每个文件的所有内容insert到数据库中,数据库中的表,是通过email分表的,大约是log_1,log_2,一直到log_1000的分表的,请问下详细的解决方案,比如说怎么样能保证到每个文件在很快的时间内入库,使得脚本执行更有效率

先贴一段代码

error_reporting(E_ALL & ~E_NOTICE);

//接收参数

$mysql_host  = XX.XX.XX.XX;

$mysql_user  = XXX;

$mysql_pass  = XX;

$mysql_port  = 3306;

$mysql_db    = 'test';

$table_pre   = 'log_';

$gz_log_file = a.gz;

//脚本执行日志

$exec_log = '/data_log/record.txt';

file_put_contents ($exec_log,'*****************************************START***********************************'."\r\n",FILE_APPEND );

file_put_contents ($exec_log,'param is mysql_host='.$mysql_host.' mysql_user='.$mysql_user.' mysql_pass='.$mysql_pass.' mysql_port='.$mysql_port.' mysql_db='.$mysql_db.' table_pre='.$table_pre.' gz_log_file='.$gz_log_file.' start_time='.date("Y-m-d H:i:s")."\r\n",FILE_APPEND );

//读日志入库

$z_handle = gzopen($gz_log_file,'r');

$time_start = microtime_float();

$mysql_value_ary = array();

//链接数据库

$conn = mysql_connect("$mysql_host:$mysql_port",$mysql_user,$mysql_pass);

if (!$conn) {

file_put_contents ($exec_log,'Could not connect database error, error='.mysql_error()."\r\n",FILE_APPEND );

exit;

}

$selec_db = mysql_select_db($mysql_db);

if(!$selec_db){

file_put_contents ($exec_log,'select database error, database='.$mysql_db."\r\n",FILE_APPEND );

exit;

}

while(!gzeof($z_handle)){

$each_gz_line = gzgets($z_handle, 4096);

$line_to_array = explode("\t",$each_gz_line);

//过滤无效日志

if(!empty($line_to_array[3]) && !empty($line_to_array[2]) && !empty($line_to_array[4])){

$insert_value = "('".$line_to_array[3]."','".$line_to_array[2]."','".$line_to_array[1]."','".$line_to_array[4]."','".$line_to_array[0]."') ";

$insert_sql = "insert into $table_name (uid,email,ip,ctime) values $insert_value ";

$table_id = abs(crc32($line_to_array[2]) % 1000);

$table_name = $table_pre.$table_id;

$result = mysql_query($insert_sql);

if(!$result){

//如果插入错误,则记录日志

file_put_contents ($exec_log,'table_name='.$table_name.' email='.$line_to_array[2]."\r\n",FILE_APPEND );

}

}

}

$time_end = microtime_float();

$diff = $time_end - $time_start;

file_put_contents ($exec_log,'success to insert database,log_file is '.$gz_log_file.' time-consuming is='.$diff."s \r\n",FILE_APPEND );

file_put_contents ($exec_log,'*******************************************END***********************************'."\r\n",FILE_APPEND );

gzclose($z_handle);

上面的代码执行起来,很慢,不可忍受,请大牛帮忙

海量日志 日志分析 脚本 效率

------解决方案--------------------

表类型修改为:InnoDB,然后用事务实施,

还不行的话,换load file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值