Просмотр поста

.
ДоХтор
# Koenig (26.09.2015 / 23:14)
ДоХтор, вроде там задачка для детей)
Почувствую себя ребёнком
У меня какой-то быдлокод получился... Вроде бы всё просто, но туева хуча циклов, как ни крути, имеет место. И ещё я не реализовал сортировку по дате. И вообще, мне не понравилось моё решение, если найду время, то перепишу заново.
Пример (+/-)
<?php

/**
 * Напиши скрипт, который будет:
 * Собирать юзерагенты и ip пользователей, обращающихся к нему и сохранять в файл.
 * В одном файле хранятся записи за последние 5 минут. Через 5 минут создается новый файл и 
 * последующие 5 минут в него пишутся юзер агенты и так далее.
 * 
 * Файлов может быть не более 10 штук.
 * 
 * После всего этого написать страничку, которая будет выводить юзерагенты из этих файлов 
 * в таблице примерно такого вида:
 * Дата | Юзерагент | IP
 * 
 * При выводе данных из файлов не должно быть повторяющихся связок IP + Юзерагент.
 * Ну и сделать возможность сортировки по дате.
 */
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 = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
$user_agent = str_replace('|', '', $user_agent);
$ip = $_SERVER['REMOTE_ADDR'];
$filing = $sid . '|' . $date . '|' . $user_agent . '|' . $ip;

$array_names = array();
foreach (glob('*.txt') as $file_name) {
    $array_names[] = $file_name;
}
$all_strings = sizeof($array_names);

if ($all_strings == 0) {
    file_put_contents($textfile, $filing . PHP_EOL, LOCK_EX);
} else {
    $basename = (int)basename($array_names[($all_strings - 1)], '.txt');
    if ($time_is_up > $basename) file_put_contents($textfile, $filing . PHP_EOL, LOCK_EX);
    
    $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 . PHP_EOL, FILE_APPEND | LOCK_EX);
    }
}

if ($all_strings > $numb_files) {
    $array_names = array_reverse($array_names);
    $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);
    
    for ($i = 0; $i < $numb_files; $i++) {
        file_put_contents($arr_fnames[$i], $arr_contents[$i]);
    }
}

/** ******************** Вывод в браузер ******************** **/

$array_result = array();

foreach (glob('*.txt') as $file_name) {
    $array_result[] = file_get_contents($file_name);
}

$input = array_reverse($array_result);
$array_result = array_unique($input);

$contents = '<table border="1">';
$contents .= '<tr><td>Дата</td><td>Браузер</td><td>IP</td></tr>';

foreach ($array_result as $result) {
    foreach (explode(PHP_EOL, $result) as $result) {
        $expl_arr = explode('|', $result);
        if (empty($expl_arr[0])) continue;
        $contents .= '<tr><td>'. $expl_arr[1] .'</td><td>'. $expl_arr[2] .
                     '</td><td>'. $expl_arr[3] .'</td></tr>';
    }
}

$contents .= '</table>';

echo $contents;