Скрипт обрабатывает папку с файлами в которых хранятся данные, в файле данные хранятся в виде 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