Задачки по PHP

8.09K
.

Koenig, а я иначе подошёл к решению - написал поле для ввода желаемого отрезка времени, добавил три радио кнопки: * минуты, * часы, * сутки, и один чекбокс "Последние сверху." При нажатой кнопке вычисляется запрашиваемый период, и выводится результат.

.

Jahak

Ты переписал своё решение или дополнил?

Дополняю.
а у тебя в 10 файл запись разрешена 5 минут или сразу идёт блокировка, когда 10 файл создан?

Не так и ни этак. У меня в каждый, созданный последним файл, идёт запись в течении 5-и минут(если к скрипту были запросы), по-истечении 5-и минут создаётся новый файл и данные пишутся уже в него, а чтение идёт уже изо всех файлов.
То есть, для записи всегда используется последний файл, а не 10-й, 9-й, ... 3-й.
.

ДоХтор, Ты не понял меня, я хочу узнать как он у тебя работает именно с 10-ым файлом. У тебя в него поступают данные 5 минут? или как? Можешь выложить свой скрипт в архиве, я посмотрю как он у тебя работает.

.
# Jahak (03.10.2015 / 21:01)
ДоХтор, Ты не понял меня, я хочу узнать как он у тебя работает именно с 10-ым файлом. У тебя в него поступают данные 5 минут? или как? Можешь выложить свой скрипт в архиве, я посмотрю как он у тебя р
Я тебя понял. И повторяю - мой скрипт на запись работает с последним файлом, каким бы по счёту он небыл: 1-м, или 2-м ... или 9-м, или 10-м. Кстати, можно же изменить количество создаваемых файлов с десяти на (к примеру) 18-ть, и в этом случае скрипт так же будет работать с восемнадцатым файлом(если он создан) как с последним. Привожу листинг кода, но без вывода результата, так как вывод я переписываю.
исходный код логера (+/-)

<?php
 
if (isset($_REQUEST[session_name()])) session_start();

$us_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'];
$ref = filter_input(INPUT_SERVER, 'HTTP_REFERER');
$ref = !empty($ref) ? '<a href="'. $ref .'">'. $ref .'</a>' : null;
$filing = $us_sid .'|'. $date .'|'. $user_agent .'|'. $ip .'|'. $ref . 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($us_sid, $temp)) {
        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($us_sid, $temp)) {
        file_put_contents(end($array_names), $filing, FILE_APPEND | LOCK_EX);
    }
}
.

В общем не смог я победить повторы пар юзер-айпи. Если читать из одного файла, то можно было бы, а изо всех - у меня не вышло.

код логера (+/-)
<?php

session_start();

$us_sid = session_id();
$textfile = time() . '.txt';
$time_is_up = time() - 300;
$numb_files = 10;

$content = null;
$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'];
$ref = filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$ref = !empty($ref) ? '<a href="'. $ref .'">'. $ref .'</a>' : null;
$filing = $us_sid .'|'. $date .'|'. $user_agent .'|'. $ip .'|'. $ref . 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(end($array_names), '.txt');
    
    if ($time_is_up > $basename) file_put_contents($textfile, $filing);
    
    $array_names = glob('*.txt');
    $end_file = file_get_contents(end($array_names));
    $temp = array();
    
    foreach (explode(PHP_EOL, $end_file) as $string) {
        $array = explode('|', $string);
        $temp[] = $array[0];
    }
    
    if (!in_array($us_sid, $temp)) {
        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));    
    $temp = array();
    
    foreach (explode(PHP_EOL, $file) as $string) {
        $array = explode('|', $string);
        $temp[] = $array[0];
    }
    
    if (!in_array($us_sid, $temp)) {
        file_put_contents(end($array_names), $filing, FILE_APPEND | LOCK_EX);
    }
}

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

$array_files = isset($_POST['check']) ? array_reverse(glob('*.txt')) : glob('*.txt');
$multiplicand = isset($_POST['multiplicand']) ? (int)$_POST['multiplicand'] : 30;
$multiplier = isset($_POST['multiplier']) ? (int)$_POST['multiplier'] : 60;
$composition = $multiplicand * $multiplier;
$time = time() - $composition;
$contents = null;
$sort_array = array();

if (!empty($_POST)) {
    foreach ($array_files as $str_fname) {
        if ((int)basename($str_fname, '.txt') >= $time) {
            foreach (explode(PHP_EOL, file_get_contents($str_fname)) as $str) {
                if (strlen($str) == '') continue;
                $sort_array[] = $str;
            }
        }
    }
    
    $content = '<table border="1" style="font-size: 14px;">'. 
                           '<tr><td>Дата</td><td>Браузер</td><td>IP</td><td>Откуда</td></tr>';

    foreach ($sort_array as $sort_str) {
        $arr = explode('|', $sort_str);
        $content .= '<tr><td>'. $arr[1] .'</td><td>'. $arr[2] .'</td>'.
                    '<td>'. $arr[3] .'</td><td>'. $arr[4] .'</td></tr>';
    }

    $content .= '</table>';
}

?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html" />
<title>Статистика посещений</title>
</head>
<body>
    <form method="post">
        <p>
            Статистика за период &nbsp;
            <input type="text" name="multiplicand" value="<?=$multiplicand?>" maxlength="2" size="1" />
            <input type="radio" name="multiplier" value="60" checked="checked" /> минут
            <input type="radio" name="multiplier" value="3600" /> часов 
            <input type="radio" name="multiplier" value="86400" /> суток
        </p>
        <p>
            Последние сверху
            <input type="checkbox" name="check" value="1" checked="checked" />
        </p>
        <input type="submit" value="просмотр" /><br />
    </form>
    <p><?=$content?></p>
</body>
</html>

Демо скрипта
.

ДоХтор, Выложи в архиве свой логер, я посмотрю нормально с компьютера.

.
(\/)____o_O____(\/)

Jahak, так с компа можно норм копипастить

.
(\/)____o_O____(\/)

долго одну задачу мусолим. предлагаю новые порешать

.
# Koenig (07.10.2015 / 15:26)
Jahak, так с компа можно норм копипастить
Не спорю, но проблема в том что на компе у меня пока что нет инета, а с телефона да ещё и с Opera Mini вообще отстойно копировать
.
# Koenig (07.10.2015 / 15:27)
долго одну задачу мусолим. предлагаю новые порешать
Согласен, предлогай задачки
Всего: 270