# Koenig (26.09.2015 / 13:50)
кстати Макса задача не решена осталась
прикольно делать одно т3 разными способами. надо развивать тему
ты о переборе пароля? вроде ж несколько последних работают как нужно
Blade, я про логер переходов. вон Док уже в теме
ДоХтор, бывает удобным писать с конца. то есть от результата к вычислениям
Я сделал это!
Теперь всё работает именно так, как требовалось. Осталось только два последних пункта решить, я ниасилил(хотя это должно быть проще, чем всё написанное...):
1. При выводе данных из файлов не должно быть повторяющихся связок IP + Юзерагент.
(в один и тот же файл повторы не записываются, но вот вывод идёт из всех файлов, и как и с чем сравнивать, я не догнал)
2. Сделать возможность сортировки по дате
(до этого я ещё не добрапся)
Реализовал в двух файлах, log.php и index.php , можно и в одном конечно же.
Демо
Ну и сам код
index.php (+/-)
<?include_once 'log.php'?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html" />
<title>Статистика посещений</title>
</head>
<body>
<?=$contents?>
</body>
</html>
log.php (+/-)
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL | E_STRICT);
if (!isset($_REQUEST[session_name()])) session_start();
$sid = session_id();
$textfile = time() . '.txt';
$time_is_up = time() - 300;
$numb_files = 10;
$date = date('j.m.Y - H:i:s');
$user_agent = trim(htmlspecialchars($_SERVER['HTTP_USER_AGENT']));
$user_agent = str_replace('|', '', $user_agent);
$ip = $_SERVER['REMOTE_ADDR'];
$filing = $sid . '|' . $date . '|' . $user_agent . '|' . $ip . PHP_EOL;
if (sizeof(glob('*.txt')) == 0) {
file_put_contents($textfile, $filing);
}
$array_names = glob('*.txt');
$all_strings = sizeof($array_names);
if ($all_strings > 0 && $all_strings < $numb_files) {
$basename = (int)basename($array_names[($all_strings - 1)], '.txt');
if ($time_is_up > $basename) file_put_contents($textfile, $filing);
$array_names = glob('*.txt');
$end_file = file_get_contents(end($array_names));
$explode = explode(PHP_EOL, $end_file);
$temp = array();
foreach ($explode as $string) {
$array = explode('|', $string);
$temp[] = $array[0];
}
if (!in_array($sid, $temp)) {
$array_names = glob('*.txt');
file_put_contents(end($array_names), $filing, FILE_APPEND | LOCK_EX);
}
}
if (sizeof(glob('*.txt')) >= $numb_files) {
$array_names = array_reverse(glob('*.txt'));
$arr_fnames = array();
$arr_contents = array();
for ($i = 0; $i < $numb_files; $i++) {
$arr_fnames[] = $array_names[$i];
$arr_contents[] = file_get_contents($array_names[$i]);
}
foreach (glob('*.txt') as $filename) unlink($filename);
$basename = (int)basename($arr_fnames[0], '.txt');
if ($time_is_up > $basename) {
file_put_contents($textfile, $filing);
for ($i = 0; $i < ($numb_files - 1); $i++) {
file_put_contents($arr_fnames[$i], $arr_contents[$i]);
}
} else {
for ($i = 0; $i < $numb_files; $i++) {
file_put_contents($arr_fnames[$i], $arr_contents[$i]);
}
}
$array_names = glob('*.txt');
$file = file_get_contents(end($array_names));
$explode = explode(PHP_EOL, $file);
$temp = array();
foreach ($explode as $string) {
$array = explode('|', $string);
$temp[] = $array[0];
}
if (!in_array($sid, $temp)) {
file_put_contents(end($array_names), $filing, FILE_APPEND | LOCK_EX);
}
}
/** ******************** Вывод в браузер ******************** **/
$array_files = glob('*.txt');
$arr_result = array();
foreach ($array_files as $str_fname) {
foreach (explode(PHP_EOL, file_get_contents($str_fname)) as $str) {
$arr_result[] = $str;
}
}
$arr_result = array_diff($arr_result, array(''));
foreach ($arr_result as $result) {
$expl_arr[] = explode('|', $result);
}
$expl_arr = array_reverse($expl_arr);
$contents = '<table border="1"><tr><td>Дата</td><td>Браузер</td><td>IP</td></tr>';
foreach ($expl_arr as $arr) {
$contents .= '<tr><td>' . $arr[1] . '</td><td>' . $arr[2] .
'</td><td>' . $arr[3] . '</td></tr>';
}
$contents .= '</table>';
ДоХтор, на самом деле я думаю можно все короче записать
# Koenig (28.09.2015 / 19:42)
ДоХтор, на самом деле я думаю можно все короче записать
Я тоже так считаю, позже выложу свой велосипед
# Koenig (28.09.2015 / 19:42)
ДоХтор, на самом деле я думаю можно все короче записать
Возможно. Я не смог короче. Мне сперва задача показалась простой, но в процессе написания столкнулся с тем, что файлы постоянно добавляются, и работу по записи надо перенаправлять на вновь созданный файл, и поэтому надо постоянно считывать файлы с диска, при этом проверяя, не появилась ли необходимость в создании нового файла, и если нет, то дописывать строку в последний файл. А ещё (тоже вроде бы плёвое дело) я так и не понял, как убрать из вывода в браузер повторяющиеся пары агент | ай-пи. Подскажи мне, плиз.
# ДоХтор (28.09.2015 / 20:14)
А ещё (тоже вроде бы плёвое дело) я так и не понял, как убрать из вывода в браузер повторяющиеся пары агент | ай-пи. Подскажи мне, плиз.
Код не смотрел, но как вариант: считывать файл логов, проверять юзерагента/ip на сходство и, если его нет в списке, то добавлять.
# Blade (28.09.2015 / 20:31)
Код не смотрел, но как вариант: считывать файл логов, проверять юзерагента/ip на сходство и, если его нет в списке, то добавлять.
Я иначе реализовал запись:
Считываю последний созданный файл
Проверяю на сходство с $SID и если нет в списке - добавляю строку в конец файла.
Может быть в этом загвоздка? ... Просто я предположил, что ай-ди сессии проверять будет надёжней(два одинаковых точно не будет в списке)
И ещё один момент - я проверяю последний созданный файл, и в него же записываю. Но только что пришла идея - проверять надо все файлы, а записывать в последний.