Задачки по PHP

8.09K
.
The Frontend-Warrior
# Koenig (26.09.2015 / 13:50)
кстати Макса задача не решена осталась
прикольно делать одно т3 разными способами. надо развивать тему
ты о переборе пароля? вроде ж несколько последних работают как нужно
.
(\/)____o_O____(\/)

Blade, я про логер переходов. вон Док уже в теме

.
(\/)____o_O____(\/)

ДоХтор, бывает удобным писать с конца. то есть от результата к вычислениям

.

Я сделал это!
Теперь всё работает именно так, как требовалось. Осталось только два последних пункта решить, я ниасилил(хотя это должно быть проще, чем всё написанное...):
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>';

.
(\/)____o_O____(\/)

ДоХтор, на самом деле я думаю можно все короче записать

.
# Koenig (28.09.2015 / 19:42)
ДоХтор, на самом деле я думаю можно все короче записать
Я тоже так считаю, позже выложу свой велосипед
.
# Koenig (28.09.2015 / 19:42)
ДоХтор, на самом деле я думаю можно все короче записать
Возможно. Я не смог короче. Мне сперва задача показалась простой, но в процессе написания столкнулся с тем, что файлы постоянно добавляются, и работу по записи надо перенаправлять на вновь созданный файл, и поэтому надо постоянно считывать файлы с диска, при этом проверяя, не появилась ли необходимость в создании нового файла, и если нет, то дописывать строку в последний файл. А ещё (тоже вроде бы плёвое дело) я так и не понял, как убрать из вывода в браузер повторяющиеся пары агент | ай-пи. Подскажи мне, плиз.
.
The Frontend-Warrior
# ДоХтор (28.09.2015 / 20:14)
А ещё (тоже вроде бы плёвое дело) я так и не понял, как убрать из вывода в браузер повторяющиеся пары агент | ай-пи. Подскажи мне, плиз.
Код не смотрел, но как вариант: считывать файл логов, проверять юзерагента/ip на сходство и, если его нет в списке, то добавлять.
.
# Blade (28.09.2015 / 20:31)
Код не смотрел, но как вариант: считывать файл логов, проверять юзерагента/ip на сходство и, если его нет в списке, то добавлять.
Я иначе реализовал запись:
Считываю последний созданный файл
Проверяю на сходство с $SID и если нет в списке - добавляю строку в конец файла.

Может быть в этом загвоздка? ... Просто я предположил, что ай-ди сессии проверять будет надёжней(два одинаковых точно не будет в списке)
.

И ещё один момент - я проверяю последний созданный файл, и в него же записываю. Но только что пришла идея - проверять надо все файлы, а записывать в последний.

Всего: 270