Задачки по PHP

8.09K
.
(\/)____o_O____(\/)

ДоХтор, да он про мой код написал, я сегодня пьян, выходной после тяжелой недели, не охото за код ))

.
# Koenig (02.10.2015 / 22:45)
ДоХтор, да он про мой код написал, я сегодня пьян, выходной после тяжелой недели, не охото за код ))
Ты что-то перепутал, Дмитрий
Тут речь идёт о его коде.
.
(\/)____o_O____(\/)

ДоХтор, http://johncms.com/forum/index ... 19242 не? )

.

Koenig,

не знаю почему но при записи в файлы по каким то причинам попадают пустые строки

Могу предположить, что пустые строки создаются функцией explode(). Твой код я не видел, но в своём после эксплода делаю проверку строк на пустоту, и только потом записываю в переменную значения массива.
.
# Koenig (02.10.2015 / 22:58)
ДоХтор, http://johncms.com/forum/index ... 17237 не? )
Вы меня окончательно запутали! Кто кому пишет? ))
.
(\/)____o_O____(\/)

кароч код почти в разработке
наробатки, на самом деле есть как минимум три черыре варианта и функции к действию, надо экспериментировать, может какие то решения и мой код подскажет

код (+/-)
<?php

/*
Напиши скрипт, который будет собирать юзерагенты и ip пользователей, обращающихся к нему и сохранять в файл.
 В одном файле хранятся записи за последние 5 минут. Через 5 минут создается новый файл и последующие 5 минут в него пишутся юзер агенты и так далее.

 Файлов может быть не более 10 штук.

 После всего этого написать страничку, которая будет выводить юзерагенты из этих файлов в таблице примерно такого вида:
 Дата | Юзерагент | IP

 При выводе данных из файлов не должно быть повторяющихся связок IP + Юзерагент.
 Ну и сделать возможность сортировки по дате.
*/

// debug

$head = '
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=yes">
<meta name="HandheldFriendly" content="true">
<meta name="MobileOptimized" content="width">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta name="Generator" content="test">
<meta name="keywords" content="test">
<meta name="description" content="text">
<link rel="stylesheet" href="style.css">
<link rel="shortcut icon" href="favicon.ico">
<!-- <link rel="alternate" type="application/rss+xml" title="RSS | Новости ресурса" href="http://johncms.com/rss/rss.php"> -->
<title>test</title>
</head><body>
';

$debug = 1;

if ($debug) {
    #$base = file_get_contents('base-ip-ua.txt');
    #$parts = explode(PHP_EOL, $base);
    $parts = file('base-ip-ua.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $user = explode(' - ', $parts[array_rand($parts)]);
    $ip = htmlspecialchars($user[0]);
    $ua = htmlspecialchars($user[1]);
    $timeleft = 30;
} else {
    $ip = htmlspecialchars($_SERVER['REMOTE_ADDR']);
    $ua = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
    $timeleft = 300;
}

$special = md5($ip . $ua);

$time = time();
#$name = substr(md5(uniqid(time())), 0, 8) . '.txt';
$name = $time . '.txt';

$savedata = $special . '=' . $time . '|' . $ip . '|' . $ua . "\n";

$dir = 'simbatest/';

if(!is_dir($dir)) {
    mkdir($dir, 0777, 1);
}

$files = array();

$base = array_diff(scandir($dir), array('.', '..'));

foreach ($base as $fname) {
    $files[] = $dir . $fname;
}

#echo '<pre>' . print_r($files, 1) . '</pre>'; exit;
/*
foreach (new FilesystemIterator($dir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::CURRENT_AS_FILEINFO) as $SplFileInfo) {
    $files[] = $SplFileInfo;
}
*/

#if (!sizeof($files)) {
    /*
    $whrite = new SplFileObject($dir . $name, 'a+');
    $whrite->ftruncate(0); // wb
    if ($whrite->flock(LOCK_EX)) {
        $whrite->fwrite(json_encode(array('spc' => $special, 'data' => array('time' => $time, 'ip' => $ip, 'ua' => $ua)), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE) . PHP_EOL);
        $whrite->flock(LOCK_UN);
    }
    */
#    file_put_contents($dir . $name, $savedata);
#    header('Refresh: 5; ?');
#    echo $head . '</body></html>';
#}

$file = end($files);
if (sizeof($files) < 10 || (sizeof($files) == 10 && (fileatime($file) + $timeleft > filemtime($file)))) {
    $whritefile = sizeof($files) > 0 && (fileatime($file) + $timeleft > filemtime($file)) ? $file : $dir . $name;
    /*
    $whrite = new SplFileObject($whritefile, 'a+');
    if ($whrite->flock(LOCK_EX)) {
        $whrite->fwrite(json_encode(array('spc' => $special, 'data' => array('time' => $time, 'ip' => $ip, 'ua' => $ua)), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE) . PHP_EOL);
        $whrite->flock(LOCK_UN);
        header('Refresh: 5; ?');
        echo $head . '</body></html>';
    }
    */
    file_put_contents($whritefile, $savedata, FILE_APPEND | LOCK_EX);
    header('Refresh: 5; ?');
    echo $head . '</body></html>';
    exit;
} 

#echo fileatime($file) + $timeleft . ' - ' . filemtime($file);

if (sizeof($files) == 10 && fileatime($file) + $timeleft <= filemtime($file)) {    
    echo $head;
    if (isset($_GET['view'])) {
        $view = array();
        foreach ($files  as $file) {
            #$read = file_get_contents($file);
            $parts = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            #$parts = explode("\n", $read);
            #echo ($key1 +1) . ' - ' . sizeof($parts) . '<br />';
            #$read = new SplFileObject($file->getPathname(), 'rb');
            #$read->setFlags(SplFileObject::SKIP_EMPTY);
            foreach ($parts as $key => $data) {
                $out = explode('=', $data);
                $spc = $out[0];
                $dt = explode('|', $out[1]);
                $view[$spc] = $dt;
            }
        }
        #echo '<pre>' . print_r($view, 1) . '</pre>'; exit;
        if (isset($_GET['view']) && isset($_GET['sort'])) {
            // sort
        }
        echo '
            <style type="text/css">
                table { 
                width: 100%; /* Ширина таблицы */
                border: 4px double black; /* Рамка вокруг таблицы */
                border-collapse: collapse; /* Отображать только одинарные линии */
                }
                th { 
                text-align: left; /* Выравнивание по левому краю */
                background: #ccc; /* Цвет фона ячеек */
                padding: 5px; /* Поля вокруг содержимого ячеек */
                border: 1px solid black; /* Граница вокруг ячеек */
                }
                th { 
                padding: 5px; /* Поля вокруг содержимого ячеек */
                border: 1px solid black; /* Граница вокруг ячеек */
                }
            </style>
        ';
        echo '<table>
            <tr><th>Дата</th><th>IP</th><th>UA</th></tr>';
        foreach ($view as $key => $data) {
            echo '<tr><th>' . date('d-m-Y h:i:s', $data[0]) . '</th><th>' . $data[1] . '</th><th>' . $data[2] . '</th></tr>';
        }
        echo '</table>';
    }
    echo '<div><a href="?view">Посмотреть таблицу</a></div>';
    echo '</body></html>';
}
.

Koenig, Это
if (sizeof($files) < 10 || (sizeof($files) == 10 && ....
можно же короче записать
if (sizeof($files) <= 10 && ....
А ты вывод в браузер из одного последнего файла читаешь?

.
(\/)____o_O____(\/)

ДоХтор, с массива же вывод идет

.
ДоХтор
# Koenig (02.10.2015 / 23:48)
ДоХтор, с массива же вывод идет
А я пишу в последний файл(согласно времени), а вот читаю изо всех файлов, и тут у меня проблема, как убрать одинаковые связки юзер+айпи, если все строки изо всех файлов разные? Т.е., строка имеет такой вид
cqrcnasrbusvr3cv2aumpkq2g4|3.10.2015 - 00:09:11|Mozilla/5.0 (Windows NT 5.1; rv:40.0) Gecko/20100101 Firefox/40.0|127.0.0.1

и первый ключ массива (дата и время) всё время новый?
.
(\/)____o_O____(\/)

ДоХтор, глнь как сделал, формирование массива под вывод

Всего: 270