ДоХтор, да он про мой код написал, я сегодня пьян, выходной после тяжелой недели, не охото за код ))
# Koenig (02.10.2015 / 22:45)
ДоХтор, да он про мой код написал, я сегодня пьян, выходной после тяжелой недели, не охото за код ))
Ты что-то перепутал, Дмитрий
Тут речь идёт о его коде.
Koenig,
не знаю почему но при записи в файлы по каким то причинам попадают пустые строки
Могу предположить, что пустые строки создаются функцией explode(). Твой код я не видел, но в своём после эксплода делаю проверку строк на пустоту, и только потом записываю в переменную значения массива.
# Koenig (02.10.2015 / 22:58)
ДоХтор, http://johncms.com/forum/index ... 17237 не? )
Вы меня окончательно запутали!
Кто кому пишет? ))
кароч код почти в разработке
наробатки, на самом деле есть как минимум три черыре варианта и функции к действию, надо экспериментировать, может какие то решения и мой код подскажет
код (+/-)
<?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 && ....
А ты вывод в браузер из одного последнего файла читаешь?
ДоХтор, с массива же вывод идет
# 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
и первый ключ массива (дата и время) всё время новый?
ДоХтор, глнь как сделал, формирование массива под вывод