Скрипт обрабатывает папку с файлами в которых хранятся данные, в файле данные хранятся в виде json строки.
Скрипт обрабатывает данные json строки и подготавливает запрос к базе данных для сохранения.
Также производится проверка на существование таких данных в базе данных.
Обработанный файл отчищается после успешных запросов к базе данных, строки которые вернули ошибки остаются в файле.
Рассмотрим код полностью:
$CF['table_logs'] = 'al_userlog'; $sql='CREATE TABLE IF NOT EXISTS `'.$CF['table_logs'].'` (`id` int(11) NOT NULL AUTO_INCREMENT,`data_c` int(11) NOT NULL,`host` varchar(255) NOT NULL,`request` text NOT NULL,`cookie` text NOT NULL,`session` text NOT NULL,`hxff` text NOT NULL,`hxri` text NOT NULL,`ra` text NOT NULL,`hua` text NOT NULL,`hr` text NOT NULL,`ru` text NOT NULL,`md5` text NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;'; $rez=$DB->QUR($sql); $path='idir'; $m1=array("!\r\n","\r\n\r\n"); $m2=array('',"\r\n"); if(file_exists($path)){ $files=scan_dir($path); foreach($files as $k => $v){ $file=$path.'/'.$v; $tmp1=''; $host = str_replace('.txt','',$v); $t=file_get_contents($file);$t=str_replace($m1,$m2,$t);file_put_contents($file,$t); $t=file($file); foreach($t as $k1 => $v1){ $arr=json_decode($v1,1); $request = $arr['r']; $cookie = $arr['c']; $session = $arr['e']; $server = json_decode($arr['s'],1); $hxff = $server['HTTP_X_FORWARDED_FOR']; $hxri = $server['HTTP_X_REAL_IP']; $ra = $server['REMOTE_ADDR']; $hua = $server['HTTP_USER_AGENT']; $hr = $server['HTTP_REFERER']; $ru = $server['REDIRECT_URL']; $md5=md5($host.$request.$session.$cookie.$arr['s']); $sql = 'SELECT id FROM '.$CF['table_logs'].' WHERE md5="'.$md5.'" LIMIT 1'; $rez = $DB->QUR_SEL($sql); if(!$rez['err']&&!$rez['kol']){ $sql = 'INSERT INTO '.$CF['table_logs'].' VALUES (0,'.mktime().',"'.addslashes($host).'","'.addslashes($request).'","'.addslashes($cookie).'","'.addslashes($session).'","'.addslashes($hxff).'","'.addslashes($hxri).'","'.addslashes($ra).'","'.addslashes($hua).'","'.addslashes($hr).'","'.addslashes($ru).'","'.addslashes($md5).'")'; $rez=$DB->QUR($sql); if($rez['err']) $tmp1.=$v1; } } file_put_contents($file,$tmp1); } }else echo 'нет папки для данных';
Разберем по частям:
$sql='CREATE TABLE IF NOT EXISTS `'.$CF['table_logs'].'` (`id` int(11) NOT NULL AUTO_INCREMENT,`data_c` int(11) NOT NULL,`host` varchar(255) NOT NULL,`request` text NOT NULL,`cookie` text NOT NULL,`session` text NOT NULL,`hxff` text NOT NULL,`hxri` text NOT NULL,`ra` text NOT NULL,`hua` text NOT NULL,`hr` text NOT NULL,`ru` text NOT NULL,`md5` text NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;'; $rez=$DB->QUR($sql);
Пару строк которые создают таблицу ЕСЛИ ЕЕ НЕТ в базе данных, если есть не создает. Здесь используется класс для работы с базой данных. QUR это тот же самый mysql_query(), возвращает результат в переменную rez[‘err’] — 0 если нет ошибок и 1 если есть ошибка.
$files=scan_dir($path); function scan_dir($dir){ $out=array(); $files = scandir($dir); foreach($files as $key => $val)if($val!='.'&&$val!='..'){ $out[] = $val; } return $out; }
сканируем директорию $path на наличие файлов и возвращаем массив с именами файлов.
foreach($files as $k => $v){ $file=$path.'/'.$v; $tmp1=''; $host = str_replace('.txt','',$v); $t=file_get_contents($file);$t=str_replace($m1,$m2,$t);file_put_contents($file,$t); $t=file($file);
Обходим весь массив с файлами, создаем переменную $host из имени файла, путем удаления .txt. Также обрабатываем файл и удаляем в файле разрывы, «!\r\n», созданные почтовым сервером, и пустые строки «\r\n\r\n».
В переменную $t переносим содержимое файла, получаем массив в котором каждый элемент это строка из файла.
foreach($t as $k1 => $v1){ $arr=json_decode($v1,1); $request = $arr['r']; $cookie = $arr['c']; $session = $arr['e']; $server = json_decode($arr['s'],1); $hxff = $server['HTTP_X_FORWARDED_FOR']; $hxri = $server['HTTP_X_REAL_IP']; $ra = $server['REMOTE_ADDR']; $hua = $server['HTTP_USER_AGENT']; $hr = $server['HTTP_REFERER']; $ru = $server['REDIRECT_URL']; $md5=md5($host.$request.$session.$cookie.$arr['s']);
Обходим массив с строками и разбираем json строку в массив, json_decode($v1,1) если не указывать 1 тогда получится объект.
$server = json_decode($arr[‘s’],1); Еще раз разбираем элемент массива в новый массив, здесь хранится данные переменной SERVER.
Функция md5 формирует уникальную строку для наших данных, используем ее для поиска в таблицу таких же данных.
Сначала проверяем, нет ли в таблице таких же данных и если нет вставляем данные в таблицу. Если при вставке произошла ошибка тогда сохраняем строку в переменную $tmp1 и в итоге ее записываем в обрабатываемый файл, если все хорошо то в файл мы запишем пустую переменную, тем самым обнулив файл.
Читайте из этой же серии
1 часть Скрипт сбора статистики о пользователях
2 часть Получение email в PHP