日志目录下有多个日志文件,每个文件压缩后大约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时,表明是不不固定的,应该不能使用。。。
最好还是用文本形式来记录日志,或者用mongdb来记录日志也好。如果用数据库来记录操作日志 的话,会有压力。