Скрипт для парсинга файла журнала 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 адреса клиента и внутри файлы.