Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Cессии и счетчик посещений на Php

2.8K
24 декабря 2002 года
unknown
6 / / 24.12.2002
В принципе, нет необходимости использовать сессии в скрипте счетчика.
Но я уже сделал такой счетчик :)
Я хочу его переделать. Пусть просто ставит cookie (все равно это происходит при открытии сессии :)
Но прежде чем начать необходимо разобраться с одной проблемой.
Дело в том, что если я вставляю счетчик на страницу находящююся на том же сайте что и скрипт, все прекрасно работает, а если я делаю вот так:

на странице находящейся на myhost2, то каждый раз стартует новая сессия, и cookie она не устанавливает :(

Сталкивался ли кто-нибудь с такой проблемой?

Счетчики SpyLog, Mail.ru и т.п. работают нормально. Они ведь наверняка используют cookie...

Заранее спасибо!
250
25 декабря 2002 года
Joker
1.4K / / 20.02.2000
Ничего, не понял. объясни технологию работы щечика, и причем там кукис и сесия..
2.8K
25 декабря 2002 года
unknown
6 / / 24.12.2002
Цитата:
Originally posted by Joker
Ничего, не понял. объясни технологию работы щечика, и причем там кукис и сесия..



1) Стартуем сессию.
2) Получаем SID.
3) Ищем его в таблице БД.
4) Если не находим добавляем запись.
....

Дальше уже неважно что.

Когда стартует сессия, PHP проверяет наличеие у клиента куки.
Если кука установлена, все ОК. PHP ,берет из куки SID и достает всю инфу для этой сессии из своего хранилища.
Если кука не установлена, PHP генерит новый SID и устанавливает новую куку.

Здесь все верно?

У меня проблема в том, что кука не устанавливается. Но происходит это только тогда, когда я вставляю счетчик на страницу, находящуюся вне сайта со скриптом.

Надеюсь в этот раз понятно объяснил %)

4
25 декабря 2002 года
mike
3.7K / / 01.10.2002
Я не первый год занимаюсь трекингом. (http://top.novgorod.ru/)

Подход неверный. Каждая сессия - это один файл в /tmp - а теперь пердставь, если твой счетик насчитает 25000 сессий ??? :)

Правильный подход - это set_cookie.

Цитата:

1) Стартуем сессию.
2) Получаем SID.
3) Ищем его в таблице БД.



А третье зачем ????

А ты не заметил, что когда заходишь на страницу с счетчиком, в строке статуса появляется знак "кирпич"?? - это говорит о том, что Cookie заблокирован!!!

Такое происходить, когда в адресной строке у тебя один хост (myhost2) а Cookie устанавливается для другого (myhost1).

Но такой эффект далего не у всех :) У меня он есть :)

См. http://www.cn-software.com/cnstats/

2.8K
25 декабря 2002 года
unknown
6 / / 24.12.2002
Цитата:

Подход неверный. Каждая сессия - это один файл в /tmp - а теперь пердставь, если твой счетик насчитает 25000 сессий ??? :)

Правильный подход - это set_cookie.


Я писал в первом посте, что хочу переделать с куками. С сессиями по дурости начал %)

Цитата:

А третье зачем ????


Затем, чтобы проверить новая эта сессия или нет.
Чтобы проверить дату последнего обращения и в случае, если оно произошло больше часа назад, создать новую сессию для того же пользователя.
Если сессия новая, дальше будем проверять по IP.
Здесь урезанный пример :)

Цитата:

А ты не заметил, что когда заходишь на страницу с счетчиком, в строке статуса появляется знак "кирпич"?? - это говорит о том, что Cookie заблокирован!!!


Я в Опере смотрел :)
Вообщем я уже и сам разобрался :)

Цитата:

Такое происходить, когда в адресной строке у тебя один хост (myhost2) а Cookie устанавливается для другого (myhost1).

Но такой эффект далего не у всех :) У меня он есть :)


Да к сожалению не у всех в настройках браузера разрешено принимать куки третьих сторон :(

Есть еще вопрос.
Если я на странице вставлю такое:
<meta http-equiv="Set-Cookie" CONTENT="visited=1; expires=Wednesday, 08-Aug-00 23:59:59 GMT; path=/">
Все ли браузеры это поймут?
Можно ли как-то проверить установку этой куки?
Ес-но интересуют все возможные варианты :)

2.8K
25 декабря 2002 года
unknown
6 / / 24.12.2002
Цитата:

Если я на странице вставлю такое:


<meta http-equiv="Set-Cookie" CONTENT="visited=1; expires=Wednesday, 08-Aug-00 23:59:59 GMT; path=/ domain=myhost1">
-------------------------------------------
фрагмент со страницы с myhost2
myhost1 - тот где счетчик

Вопросы:
Все ли браузеры это поймут?
Можно ли проверить установку этой куки из скрипта счетчика с myhost1?

4
25 декабря 2002 года
mike
3.7K / / 01.10.2002
Цитата:

Затем, чтобы проверить новая эта сессия или нет.
Чтобы проверить дату последнего обращения и в случае, если оно произошло больше часа назад, создать новую сессию для того же пользователя.
Если сессия новая, дальше будем проверять по IP.
Здесь урезанный пример :)



Погоди. А может проще все хранить в зарегистрированных переменных. Ведь в основном для них и создается сессия!!!

session_start();
session_register("COUNTER");
if (intval($COUNTER["visits"])==0) {
// Новая сессия
$COUNTER["visits"]=1
}
else {
// Пользователь уже был
$COUNTER["visits"]++;
}
$COUNTER["lastvisit"]=time();


А на счет <META Set-Cookie - не рекомендую.

2.8K
25 декабря 2002 года
unknown
6 / / 24.12.2002
Цитата:

Погоди. А может проще все хранить в зарегистрированных переменных. Ведь в основном для них и создается сессия!!!



Уффф...
НЕ ХОЧУ Я С СЕССИЯМИ РАБОТАТЬ!!! :)
Я сделал на сессиях. Сейчас буду переделывать с куками.

Ниже то, как я себе это представляю.
[SIZE=1]Замечания:

  • На сессиях все это уже работает за исключением тех проблем о которых я писал.
  • В приведенном ниже алгоритме под сессией понимается совокупность данных о времени посещений, количестве хитов и переходов по страницам одного пользователя за один сеанс. А не то что подразумевает под собой понятие сессии в PHP. (о как завернул! :)
[/SIZE]

Алгоритм работы счетчика:

Устанавливаем соединение с БД.

Устанавливаем значения рабочих переменных.

Определяем сайт и страницу, для которой будет засчитано посещение. Если не находим записей о сайте и/или странице в таблицах pages4 и sites4, заводим новые записи.

Идентифицируем посетителя:
Проверяем, установлен ли у посетителя cookie?
__ДА) Есть. Проверяем, не пора ли закрывать сессию?
____ДА) Пора.
_________Заводим новую запись в таблице sessions4.
_________Заводим новую запись для этого же пользователя (UID) в таблице users4 с данным IP и новым SID.
____НЕТ) Проверяем, есть ли в таблице users4 запись, о посетителе с таким же IP.
______ДА) Все ОК. Пользователь идентифицирован.
______НЕТ) Значит изменился IP, добавляем запись в users (пользователь старый => UID прежний)
__НЕТ) Заводим новую запись в таблице sessions4
_______Проверяем есть ли в таблице users4 записи о посещениях с данного IP?
_________ДА) Есть. Возможно прокси, или cookie был удален.
_____________Выясняем количество посещений с этого IP через таблицу users4. Больше одного посещения?
_______________ДА) Скорее всего, cookie был удален.
___________________Заводим новую запись для этого же пользователя (UID) в таблице users4, но со ссылкой на новую сессию в sessions4.
_______________НЕТ) Скорее всего, посетитель пришел через прокси.
____________________Значит, возможно, что он новенький.
____________________Получаем новый UID и заводим новую запись в users4.
_________НЕТ) Этот посетитель пришел впервые.
______________Получаем новый UID и заводим новую запись в users4.

Устанавливаем cokie.

Добавляем запись о посещении в таблицу hits4.

Обновляем время последнего посещения для сессии в таблице sessions4.

Получаем статистику.

Закрываем соединение с БД.

Запрещаем кэширование станиц

Сообщаем браузеру, что результатом работы скрипта будет PNG-картинка.

Создаем и изображение и выводим на него полученные данные.

Отправляем изображение браузеру в PNG-формате.

Освобождаем память, выделенную под картинку.

PS: Сори, если искарябалось...
4
25 декабря 2002 года
mike
3.7K / / 01.10.2002
Далеко так не протянешь :)
Сколько циферок планируется на счетчике. Все что ты описал будет работать до 100 тыс, не больше.
2.8K
25 декабря 2002 года
unknown
6 / / 24.12.2002
Цитата:
Originally posted by mike
Далеко так не протянешь :)
Сколько циферок планируется на счетчике. Все что ты описал будет работать до 100 тыс, не больше.


100 тысяч - это не так мало :)

А если счетчик делать для серьезного проекта (>1000 хитов в день), то и места думаю будет поболе ,и СУБД сменить можно... на Adabas например, он уж точно нагрузку выдержит :)

Да и потом можно раз в мсяц, например, подводить черту и чистить все таблицы.
Оставлять только одну запись для каждого UID а остальное на хер :)
А статистику за месяц писать в отдельную таблицу.

4
25 декабря 2002 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by unknown

100 тысяч - это не так мало :)

А если счетчик делать для серьезного проекта (>1000 хитов в день), то и места думаю будет поболе ,и СУБД сменить можно... на Adabas например, он уж точно нагрузку выдержит :)


Не думаю.

Цитата:

Да и потом можно раз в мсяц, например, подводить черту и чистить все таблицы.
Оставлять только одну запись для каждого UID а остальное на хер :)
А статистику за месяц писать в отдельную таблицу.



Это не поможет.

У меня статистика за 30 дней занимает 18Gb.
Проблема в том, что в секунду обращается до 80 посетителей

и сколько получается соединений с SQL сервером ??

MySql скаже "to many connections", Oracle "To many sessions"

Я сейчас пишу на C++ без баз. Планирую до 300 обращений в секунду - даже от Apache придется отказаться, так каждый его процесс занимет ~5Mb

5Mb*300=1.5Gb оперативки кушать будет, плюс Apache не способен быстро отдавать cgi

328
25 декабря 2002 года
Felix
257 / / 20.07.2000
Цитата:
Originally posted by mike

Я сейчас пишу на C++ без баз.


А где собираешься хранить даные в файлах???? просто я думал над таким вопросом не для счетчика правда... думал чем бы заменить базы....

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог