ホームページ > バックエンド開発 > PHPチュートリアル > 大量のログがデータベースに保存される

大量のログがデータベースに保存される

WBOY
リリース: 2016-06-13 12:53:52
オリジナル
1131 人が閲覧しました

大規模なログ ストレージ
ログ ディレクトリには 10 個のログ ファイルがあり、圧縮後の各ファイルは、a.gz、b.gz などの .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、その他、

このディレクトリ内の各ファイルの内容をすべてデータベースに挿入したいのですが、データベース内のテーブルが log_1、log_2、log_1000 までのテーブルに分割されています。詳細な解決策を教えてください。 . 各ファイルを確実に短期間でデータベースに保存し、スクリプトの実行を効率化する方法などのソリューション
まずコードを投稿してください

<br />
	<?php<br />
		error_reporting(E_ALL & ~E_NOTICE);<br />
		//接收参数<br />
		$mysql_host  = XX.XX.XX.XX;<br />
		$mysql_user  = XXX;<br />
		$mysql_pass  = XX;<br />
		$mysql_port  = 3306;<br />
		$mysql_db    = 'test';		<br />
		$table_pre   = 'log_';<br />
		$gz_log_file = a.gz;<br />
		//脚本执行日志<br />
		$exec_log = '/data_log/record.txt';	<br />
	    file_put_contents ($exec_log,'*****************************************START***********************************'."\r\n",FILE_APPEND );<br />
		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 );		<br />
		//读日志入库		 <br />
		$z_handle = gzopen($gz_log_file,'r');<br />
		$time_start = microtime_float();<br />
		$mysql_value_ary = array();<br />
		//链接数据库<br />
		$conn = mysql_connect("$mysql_host:$mysql_port",$mysql_user,$mysql_pass);<br />
		if (!$conn) {<br />
			file_put_contents ($exec_log,'Could not connect database error, error='.mysql_error()."\r\n",FILE_APPEND );	<br />
			exit;<br />
		}<br />
		$selec_db = mysql_select_db($mysql_db);<br />
		if(!$selec_db){<br />
			file_put_contents ($exec_log,'select database error, database='.$mysql_db."\r\n",FILE_APPEND );	<br />
			exit;<br />
		}<br />
		while(!gzeof($z_handle)){<br />
			$each_gz_line = gzgets($z_handle, 4096);<br />
			$line_to_array = explode("\t",$each_gz_line);<br />
			//过滤无效日志<br />
			if(!empty($line_to_array[3]) && !empty($line_to_array[2]) && !empty($line_to_array[4])){<br />
				$insert_value = "('".$line_to_array[3]."','".$line_to_array[2]."','".$line_to_array[1]."','".$line_to_array[4]."','".$line_to_array[0]."') ";<br />
				$insert_sql = "insert into $table_name (uid,email,ip,ctime) values $insert_value ";<br />
				$table_id = abs(crc32($line_to_array[2]) % 1000);<br />
				$table_name = $table_pre.$table_id;<br />
				$result = mysql_query($insert_sql); <br />
				if(!$result){<br />
					//如果插入错误,则记录日志<br />
					file_put_contents ($exec_log,'table_name='.$table_name.' email='.$line_to_array[2]."\r\n",FILE_APPEND );	<br />
				}<br />
			}<br />
		}<br />
		$time_end = microtime_float();<br />
		$diff = $time_end - $time_start;<br />
		file_put_contents ($exec_log,'success to insert database,log_file is '.$gz_log_file.' time-consuming is='.$diff."s \r\n",FILE_APPEND );<br />
		file_put_contents ($exec_log,'*******************************************END***********************************'."\r\n",FILE_APPEND );<br />
		gzclose($z_handle);	<br />
ログイン後にコピー

上記のコードは実行が非常に遅くて耐えられません。助けてください。

大量のログを効率的に分析しますか?
-----解決策--------------------------------
テーブル タイプを InnoDB に変更し、トランザクションを使用して実装します。
それでも問題が解決しない場合は、ロード ファイルを変更してください
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート