# 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;