Cессии и счетчик посещений на Php
Но я уже сделал такой счетчик :)
Я хочу его переделать. Пусть просто ставит cookie (все равно это происходит при открытии сессии :)
Но прежде чем начать необходимо разобраться с одной проблемой.
Дело в том, что если я вставляю счетчик на страницу находящююся на том же сайте что и скрипт, все прекрасно работает, а если я делаю вот так:
на странице находящейся на myhost2, то каждый раз стартует новая сессия, и cookie она не устанавливает :(
Сталкивался ли кто-нибудь с такой проблемой?
Счетчики SpyLog, Mail.ru и т.п. работают нормально. Они ведь наверняка используют cookie...
Заранее спасибо!
Ничего, не понял. объясни технологию работы щечика, и причем там кукис и сесия..
1) Стартуем сессию.
2) Получаем SID.
3) Ищем его в таблице БД.
4) Если не находим добавляем запись.
....
Дальше уже неважно что.
Когда стартует сессия, PHP проверяет наличеие у клиента куки.
Если кука установлена, все ОК. PHP ,берет из куки SID и достает всю инфу для этой сессии из своего хранилища.
Если кука не установлена, PHP генерит новый SID и устанавливает новую куку.
Здесь все верно?
У меня проблема в том, что кука не устанавливается. Но происходит это только тогда, когда я вставляю счетчик на страницу, находящуюся вне сайта со скриптом.
Надеюсь в этот раз понятно объяснил %)
Подход неверный. Каждая сессия - это один файл в /tmp - а теперь пердставь, если твой счетик насчитает 25000 сессий ??? :)
Правильный подход - это set_cookie.
1) Стартуем сессию.
2) Получаем SID.
3) Ищем его в таблице БД.
А третье зачем ????
А ты не заметил, что когда заходишь на страницу с счетчиком, в строке статуса появляется знак "кирпич"?? - это говорит о том, что Cookie заблокирован!!!
Такое происходить, когда в адресной строке у тебя один хост (myhost2) а Cookie устанавливается для другого (myhost1).
Но такой эффект далего не у всех :) У меня он есть :)
См. http://www.cn-software.com/cnstats/
Подход неверный. Каждая сессия - это один файл в /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=/">
Все ли браузеры это поймут?
Можно ли как-то проверить установку этой куки?
Ес-но интересуют все возможные варианты :)
Если я на странице вставлю такое:
<meta http-equiv="Set-Cookie" CONTENT="visited=1; expires=Wednesday, 08-Aug-00 23:59:59 GMT; path=/ domain=myhost1">
-------------------------------------------
фрагмент со страницы с myhost2
myhost1 - тот где счетчик
Вопросы:
Все ли браузеры это поймут?
Можно ли проверить установку этой куки из скрипта счетчика с myhost1?
Затем, чтобы проверить новая эта сессия или нет.
Чтобы проверить дату последнего обращения и в случае, если оно произошло больше часа назад, создать новую сессию для того же пользователя.
Если сессия новая, дальше будем проверять по IP.
Здесь урезанный пример :)
Погоди. А может проще все хранить в зарегистрированных переменных. Ведь в основном для них и создается сессия!!!
session_start();
session_register("COUNTER");
if (intval($COUNTER["visits"])==0) {
// Новая сессия
$COUNTER["visits"]=1
}
else {
// Пользователь уже был
$COUNTER["visits"]++;
}
$COUNTER["lastvisit"]=time();
А на счет <META Set-Cookie - не рекомендую.
Погоди. А может проще все хранить в зарегистрированных переменных. Ведь в основном для них и создается сессия!!!
Уффф...
НЕ ХОЧУ Я С СЕССИЯМИ РАБОТАТЬ!!! :)
Я сделал на сессиях. Сейчас буду переделывать с куками.
Ниже то, как я себе это представляю.
[SIZE=1]Замечания:
- На сессиях все это уже работает за исключением тех проблем о которых я писал.
- В приведенном ниже алгоритме под сессией понимается совокупность данных о времени посещений, количестве хитов и переходов по страницам одного пользователя за один сеанс. А не то что подразумевает под собой понятие сессии в PHP. (о как завернул! :)
Алгоритм работы счетчика:
Устанавливаем соединение с БД.
Устанавливаем значения рабочих переменных.
Определяем сайт и страницу, для которой будет засчитано посещение. Если не находим записей о сайте и/или странице в таблицах 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: Сори, если искарябалось...
Сколько циферок планируется на счетчике. Все что ты описал будет работать до 100 тыс, не больше.
Далеко так не протянешь :)
Сколько циферок планируется на счетчике. Все что ты описал будет работать до 100 тыс, не больше.
100 тысяч - это не так мало :)
А если счетчик делать для серьезного проекта (>1000 хитов в день), то и места думаю будет поболе ,и СУБД сменить можно... на Adabas например, он уж точно нагрузку выдержит :)
Да и потом можно раз в мсяц, например, подводить черту и чистить все таблицы.
Оставлять только одну запись для каждого UID а остальное на хер :)
А статистику за месяц писать в отдельную таблицу.
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
Я сейчас пишу на C++ без баз.
А где собираешься хранить даные в файлах???? просто я думал над таким вопросом не для счетчика правда... думал чем бы заменить базы....