І скільки людей на сайті?, PHP, Програмування, статті

Makswell

Всім доброго часу доби!


Напевно, гуляючи по мережі в пошуках порн …, тобто в пошуках будь-якої інформації, ви натикалися на таку фішку, типу:


На сайті: 100 осіб


Тобто, коли приблизно в такому контексті виводиться кількість людина, присутніх в даний час на сайті. Коли я вперше побачив таку фічу, мені вона здалася цікавою і сімпотной.


Нещодавно, за особистим потреби, мені захотілося зробити таке для свого сайту і я реалізував все це справу з використанням
PHP+MySQL.


Отже, в цій статті я хочу вам розповісти, як зробити таку фічу для сайту. Це насправді простіше смаженої капусти ; =) І незабаром ви переконаєтеся в цьому.


Все що нам потрібно, це – хостинг з підтримкою PHP і MySQL і пара хвилин часу. Може бути, деякі заперечать, навіщо тут база даних, коли все можна реалізувати на файлах. Скажу вам, що MySQL в даному конкретному випадку підходить як не можна краще. З використанням файлів ж, довелося б писати набагато більше коду і займатися в більшості своїй рутиною, яка нам ні до чого; в той час як за допомогою бази даних все робиться парою-другий запитів …


Я сподіваюся, що ви вмієте хоч якось звертатися з сервером MySQL і знаєте в цілому, що таке бази даних і для чого вони служать. В іншому випадку, не можу нічим допомогти, крім як порадити звернутися до друзів, які володіють мистецтвом складати SQL-запити … Хоча, в принципі, ви можете просто скопіювати мій код і все. Однак, сама база даних все ж повинна бути налаштована …


Отже, поступово переходимо від теорії до практичної епостасі. В PHP, на жаль (та й в інших серверних мовах веб-програмування), відсутня така, на мій погляд, корисна технологія, яка дозволяла б визначати момент часу, в який людина покинула сайт. Неважливо, яким способом, він це зробив: закрив вікно броузера або перейшов по іншим посиланням. Раз PHP пасує, самі зробимо деяку подібну технологію; природно, про точність і відсутності похибок тут не говорю … Проте, все так роблять і ми так зробимо. Далі опишу, як ми будемо, власне, визначати кол-во юзерів на лінії теоретично (не торкаючись MySql і PHP конкретно). Якщо ви уловите думка, то негайно ж реалізуєте цю можливість будь-якою мовою веб-програмування і будь-яким доступним для вас методом (файли, наприклад) …


Для початку, нам потрібно встановити змінну
Точність – Час, протягом якого відвідувач буде вважатися на лінії, тобто бродячому по сайту.

Значить, при заході на сторінку, ми повинні визначити спершу-наперво IP-адреса зайшов і його
timestamp. Ніякої екзотики,
TimeStamp – Це уявлення часу, яке дорівнює “кол-ву секунд, що пройшли з півночі 1 Січень 1970 за Гринвічем до теперішнього моменту “. Це досить універсальне уявлення часу і, зокрема, саме з цим форматом працює більшість PHP-х ф-й для роботи з “датою-часом”. Вельми зручна мітка, повірте мені на слово. Тобто, чим більше число TimeStamp, чим довше “ми живемо” і чим більше “зараз часу”, перепрошую за сумбурність.
Після, ми відкриваємо будь сховище (Файли, бази даних, сесійна масив і т.п.) і видаляємо з нього всі записи (кожен запис – інформація про один зайшов на сторінку користувача), в яких TimeStamp + Точність менше поточного TimeStamp’а, або де IP-адреса збігається з поточним Ip’м. Тобто, знищуємо старі записи.
Далі записуємо дані про зайшов користувача (Залишаємо запис): IP і timestamp.
Все, підраховуємо кількість записів – це і є кол-во людина на сайті в даний час.


Чесно кажучи, вийшло так, що орієнтир все одно вівся на MySQL, а не на файли. Справді, наше чи це справа, спочатку лізти в файл і видаляти там-то, потім знову лізти в нього, щоб записати, а потім тільки зчитувати. Куди простіше спочатку вважати файл в масив, видалити з масиву старі записи і додати запис про юзера, якщо це потрібно і вже потім записати масив назад у файл. При виведенні даних же керуватися кол-м значень у масиві.


Сподіваюся, основну думку ви все ж вловили. Ми просто підраховуємо кількість юзверей, з часу заходу яких не минув час, який ми встановили (Точність).


Отже, переходимо нарешті до практики. Повторюся, для зберігання інформації буде юзаться база MySQL. Для всього цього справи ми створимо окрему таблицю. Назвемо її
online. У таблиці створимо 3 поля:



Зауважу, що поле unix матиме тип VARCHAR, а не вбудований розробниками MySQL тип TIMESTAMP. Це пов’язано з тим, що цей тип дуже незручний для зберігання даних дати \ часу в базі, як це може здатися на перший погляд.


Далі привожу запит, виконавши який, ви створите відповідну таблицю з потрібними полями. Запит можна виконати функцією PHP mysql_query(), Або в небудь зручною уболочке для роботи з MySQL. Наприклад в
PHPMyAdmin.


CREATE TABLE `online` (
`id` int(10) NOT NULL
auto_increment,
`ip` varchar(20) NOT NULL default
‘0’,
`unix` varchar(60) NOT NULL default ”,
KEY `id`
(`id`)
)


Виконали? Молодці. Нагадаю, що команди синтаксису MySQL найкраще звикати писати у верхньому регістрі і не для понту, як думають деякі, а для підвищення зручності читання коду і просто тому, що так прийнято.


Після виконання запиту, нам залишається тільки написати код, який буде займатися, власне, підрахунком кол-а людина на лінії. Цей код я запхав в окрему функцію, яка зберігається в мене в файлі, а сам файл інклюдітся (include (), require ()) на кожній сторінці мого сайту де-небудь в самому початку. Я наводжу вам приклад функції точнісінько, яку я написав для свого сайту, хіба тільки трохи змінену в цілях публічного використання. При наявності необхідних знань, ви легко зможете відредагувати її під себе.


# —— Файл online.php
/ * Ф-я підраховує користувачів на лінії; повертає кількість користувачів в відформатованому вигляді, тобто для виведення результату потрібно лише прописати в потрібному місці типу: echo on_line (); * /
function
on_line() {
$ Host = “localhost”; / / хост, де розташована база даних MySql
$ Db_name = “”; / / ім’я бази даних; як правило співпадає з ім’ям користувача (змінна нижче), хоча я категорично проти однакових імен, орієнтуючись на захист …
$ Db_user = “”; / / користувач, якому дозволено доступ до бази
$ Db_password = “”; / / пароль користувача
$ Wine = 300; / / точність он-лайн (секунди); час, протягом якого користувача, який зайшов на сторінку, ми вважаємо що знаходяться на сайті
$table_online = “Online”; / / ім’я таблиці
/ / Робимо доступною глобальну змінну ІП-адреси
global $REMOTE_ADDR;
// з’єднуємося з сервером MySQL і вибираємо потрібну базу
mysql_connect($host,$db_user,$db_password) or
die(mysql_error());
mysql_select_db($db_name) or
die(mysql_error());
/ / Видаляємо всіх, хто вже пробув $ Wine секунд або у кого ІП поточний
$sql_update = “DELETE
FROM $table_online WHERE `unix`+$wine < “.time().” OR `ip`
= ‘$REMOTE_ADDR'”;
$result_update =
mysql_query($sql_update) or die(mysql_error());
// вставляємо свій запис
$sql_insert = “INSERT INTO
$table_online VALUES
(”,’$REMOTE_ADDR’,'”.time().”‘)”;
$result_insert =
mysql_query($sql_insert) or die(mysql_error());
// вважаємо уникав он-лайн
$sql_sel = “SELECT `id` FROM
$table_online”;
$result_sel = mysql_query($sql_sel) or
die(mysql_error());
$online_people = mysql_num_rows ($ result_sel); / / к-ть On-Line користувачів

$ Online_people = (string) $ online_people; / / приводимо до строковому типу (так треба .. див. далі)
$rain = strlen ($ online_people) – 1; / / номер останнього символу в числі on-line юзерів
/ / Форматування виводу (я все зробив за вас
=)
if($online_people[$rain]==2||$online_people[$rain]==3
||$online_people[$rain]==4
||(strlen($online_people)!=1&&$online_people[strlen($online_people)-2]!=1))
$line = “Людини”; else $ line = “людина”; / / $ line – змінна, визначальна формат виводу
/ / Повертаючи результат
return “На сайті
<strong>”.$online_people.”</strong>$line”;
}


Ось така от функція. Де-небудь на початку файлу вам треба буде вставляти її як-небудь на кшталт:


include ‘online.php’;


А в тому місці, де потрібно вивести кол-во користувачів, писати:


echo on_line();


Тепер роз’ясню трохи код функції, так як в ній самій я все докладно прокоментував. Спочатку йдуть змінні, потрібні для вдалого коннекта до бази, а також мінлива
$wine – Наша точність. Також робиться доступною з функції глобальна змінна
$REMOTE_ADDR, Яка повертає IP-адресу клієнтського комп’ютера. Після відбувається з’єднання з сервером MySQL. І вже після починається найцікавіше.


Першим запитом до бази (запити виконуються ф-й
mysql_query() ) Ми видаляємо всі записи, в яких timestamp + $wine менше поточного timestamp або в яких ІП-адреса збігається з нашим. Тобто ми видаляємо з таблиці або старих користувачів, або самих себе, щоб не повторюватися.


Другим запитом ми вставляємо свій запис зі своїм IP’м і timestamp’м. Зверніть увагу, що значення першого поля ми залишаємо порожнім, так як воно инкрементируется від вставки до вставці і само собою заповниться (збільшеним на 1 попереднім значенням).


Після всіх маніпуляцій з таблицями, в ній залишається дійсно справжнє Кількість осіб на сайті, з моменту приходу яких не пройшло $ wine секунд. Нам залишається лише простим запитом вибрати всі записи і підрахувати їх кількість. Це і буде кол-во користувачів в Он-Лайне. Зверніть увагу, що ми з вами, як люди розумні, не вибираємо відразу все поля з усіх записів (навіщо нам зайві дані, якщо потрібно тільки підрахувати кількість записів), а вибираємо тільки поле
id. Це теж прийом для оптимізації запитів, хоча багато про нього забувають або не знають.


А ось потім йде, власне, форматування даних. На мій погляд, я зробив його дуже лаконічним і елегантним. Дивитися приємно, хоча з першого разу і не зовсім зрозуміло, як відбувається процес. Можливо, таке форматування вам не знадобиться. Раптом ви захочете якось по-іншому виводити інформацію про кількість юзверей. Тоді вам залишається або прибрати форматування, або підредагувати його (в тому числі і під свій дизайн). Так чи інакше, мінлива
$online_people зберігає кол-во користувачів і далі ви вільні робити з нею все, що хочете. Можете просто повернути її ( return $online_people; ) І сам формат даних здійснювати за безпосередньої виведення, а не в тілі функції, або взагалі, як я вже казав, не здійснювати форматування:


echo “On-Line: “.on_line()


Можливо, так буде навіть красивіше.


Важливі зауваження:



З додатків, мабуть, все. Та й статті приходить Зе Енд. Радий, що ви дочитали посібник до цього місця, а ще більше естетичного насолоду мені прінісет той факт, що стаття здалося вам цікавої і залишила хороші враження та знання в баш … голові.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*