Перейти к содержимому

Скрипт разбора access.log squid`a

Программисты 1С-Битрикс Меня зовут Глеб и я программист 1С-Битрикс. Я занимаюсь разработкой сайтов на платформе 1С-Битрикс. Я могу создавать и настраивать корпоративные сайты, интернет-магазины, порталы и другие сайты. |

sc_170714Скрипт для парсинга файла журнала SQUID access.log строка из файла:

1404392236.831 100067 192.168.21.31 TCP_MISS/200 674 POST http://www.odnoklassniki.ru/push?cmd=PeriodicManager&gwt.requested=a4a&st.cmd=userMain&p_sId=-41113533393.95774 — DIRECT/200.23.127.14 text/html

Сам скрипт анализирует такие строки и если в них появляется тэг image, тогда картинка сохраняется локально.

Файлы access.log очень большие получаются и за один запуск скрипта все не получится обойти, для этого реализована фишка сохранения позиции строки пасринга.

Сам скрипт:

<?php
function save_fseek($file,$data){
	$pos = read_file($file);//читаем кол-во байт от начала файла
	file_put_contents($file, ($pos+$data));//СУММИРУЕМ КОЛ_ВО БАЙТ
}
function save_file($file,$data,$t=''){
	if ($t=='') file_put_contents($file, $data);
	else file_put_contents($file, $data."\n",FILE_APPEND);
}
function read_file($file){
	return file_get_contents($file, $data);
}
function get_img($str){//определяем есть ли в строке фото
	$t = explode(' ',$str);
	$t1 = explode('/',$t[12]);
	if ($t1[0]=='image'){
		if ($t[7] > 10000){//Файлы размером более 10Кб
			$path = 'upload/'.$t[5];
			if (!is_dir($path)) mkdir($path, 0777);
			if (download_file($t[0],$t[9],$path.'/')) echo '<span style="color:green">скачали</span> '.$t[9].'<br>';
			else echo '<span style="color:red;">не скачали</span> '.$t[9].'<br>';
		}
	}
}
function download_file($time,$fileFrom,$path){//СКАЧИВАЕМ ФАЙЛ НА СЕРВЕР
	$pos = strpos($fileFrom, '?');
	if ($pos === false) {//чистый файл
		$t=explode('/',$fileFrom); $filenameFrom = $t[count($t)-1];
	} else {//файл генерируется
		$pos = strpos($fileFrom, 'photoId');
		if ($pos === false) {//не однокласники
			$filenameFrom = 'neopred_'.rand(1,9999).'.jpg';
		} else {//файл генерируется
			$t2 = explode('photoId=',$fileFrom);
			$t3 = explode('&',$t2[1]);
			$filenameFrom = 'odnokl_'.$t3[0].'.jpg';
			$t4=explode('phototype=',$fileFrom);
			if(count($t4)){
				$fileFrom = $t4[0].'phototype=0';
			}
		}
	}
	$uploadToDir = $path.$time.'_'.$filenameFrom;
	if (file_exists($uploadToDir)) $uploadToDir = $path.'copy_'.rand(1,9999).'_'.$filenameFrom;
	if (!copy($fileFrom, $uploadToDir)) return false; else return true;
}
$kol = 5000;//ВСЕГО СТРОК
$pos = read_file('access.pos');
$s = $pos; $e = $pos + $kol;
$filename = 'access.log';
echo 'от: '.$s.' до '.$e.'<br>';

$tmp = file($filename); echo count($tmp).'-';
if ($e<count($tmp)){
	for($i=$s;$i<=$e;$i++){
		save_file('access.pos',$i);
		get_img($tmp[$i]);
	}
}else echo 'Весь файл обошли!!!';

if (isset($_GET['r'])){ $r=$_GET['r']; } else $r=1;
if ($r==1){//режим частичного чтения файла
	$handle = fopen($filename, "r");
	fseek($handle, $pos);
	for($i=1;$i<=$kol;$i++){
		$contents = fgets($handle);
		save_fseek('access.pos',strlen($contents));
		get_img($contents);
	}
	fclose($handle);
}
if ($r==2){//режим чтения файла полностью
	$handle = fopen($filename, "r");
	while (!feof($handle)) {
		$contents = fgets($handle);
		save_fseek('access.pos',strlen($contents));
		get_img($contents);
	}
	fclose($handle);
}
?>

После выполнения в папке upload появятся папки с названием IP адреса клиента и внутри файлы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.