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