首页 新闻 会员 周边

海量日志入库

0
悬赏园豆:15 [待解决问题]

日志目录下有多个日志文件,每个文件压缩后大约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的分表的,请问下详细的解决方案,比如说怎么样能保证到每个文件在很快的时间内入库,使得脚本执行更有效率
先贴一段代码

    <?php
        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);    

上面的代码执行起来,很慢,不可忍受,请大牛帮忙,我知道可以批量插入这种方式,但是,在insert时,表明是不不固定的,应该不能使用。。。

tsuliuchao的主页 tsuliuchao | 初学一级 | 园豆:187
提问于:2013-02-04 15:59
< >
分享
所有回答(1)
0

最好还是用文本形式来记录日志,或者用mongdb来记录日志也好。如果用数据库来记录操作日志 的话,会有压力。

jerry-Tom | 园豆:4077 (老鸟四级) | 2013-02-05 10:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册