[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сохранение данных ВО ВРЕМЯ работы сайта.
MoZart.Element
Добрый день!
Есть такая проблема: Как сохранять данные ВО ВРЕМЯ того, как человек находится на сайте?
Поясню более конкретно.
Пользователь заходит на сайт и видит картинку, которую сгенерировал РНР-код. Побочные результаты (Координаты некоторых точек) необходимо сохранить для последующих генераций картинки. Пользователь продолжает сидеть на сайте. Через интервал времени (пусть это будет 10 секунд) происходит перегенерация картинки основанная на текущих и на предыдущих данных. Ещё через 10 секунд картинка снова обновится основываясь на текущих, предыдущих и предпредыдущих данных. И так до тех пор, пока пользователь не уйдёт с этой страницы.
Как сохранять этот массив? (я работаю под виндой) Как сделать, чтобы для каждого пользователя был "свой" массив? И как сделать так, чтобы когда пользователь уйдёт, и его массив удалился?



Спустя 2 минуты, 46 секунд (8.07.2010 - 10:22) linker написал(а):
Ajax для обновления картинки и сессии для хранения координат

Спустя 12 минут, 35 секунд (8.07.2010 - 10:35) MoZart.Element написал(а):
А без аякса?

Спустя 46 минут, 30 секунд (8.07.2010 - 11:21) sergeiss написал(а):
Куки, наверное...
1. Хранятся они на клиенте, а не на сервере.
2. JS может записать куки в любой момент работы со страницей.
3. ПХП может прочитать куки перед выгрузкой страницы клиенту и использовать данные для формирования этой страницы (или картинки - не суть важно).

Обновление происходит каким образом, кто является инициатором? Просто таймер в JS, или нажатие пользователем чего-то, или авторефреш страницы?

Спустя 33 минуты, 34 секунды (8.07.2010 - 11:55) MoZart.Element написал(а):
Цитата (sergeiss @ 8.07.2010 - 08:21)
Куки, наверное...
1. Хранятся они на клиенте, а не на сервере.
2. JS может записать куки в любой момент работы со страницей.
3. ПХП может прочитать куки перед выгрузкой страницы клиенту и использовать данные для формирования этой страницы (или картинки - не суть важно).

Обновление происходит каким образом, кто является инициатором? Просто таймер в JS, или нажатие пользователем чего-то, или авторефреш страницы?

Инициатором обновления является таймер JS.

Можете объяснить пункты 2 и 3 более подробно, или дайте ссылочку, где почитать?
Заранее спасибо!

Спустя 1 час, 15 минут, 33 секунды (8.07.2010 - 13:10) sergeiss написал(а):
Если кратко: куки - это такие небольшие файлы, хранящиеся именно у клиента и связанные с определенным сайтом. "Отдавать" их браузер должен только тому сайту, который их установил. И у каждого браузера свои куки!!! Т.е. если ты записал что-то в куки в Опере, то ИЕ об этом не узнает никогда. И наоборот.
Хранить куки можно "вечно", в отличие от короткоживущих сессий.

В твоём случае всё достаточно легко сделать, т.к. рефреш идет через JS. Он, т.е. JS сначала записывает в куки то, что нужно, а потом даёт команду на перезагрузку. PHP запрашивает эти куки... Всё, взаимодействие налажено.


А ссылку могу дать только наиболее общую smile.gif

Заходишь в любую поисковую систему (yandex, google, ....) и вводишь в строке поиска "javascript cookie". Получаешь много информации, читаешь, вникаешь. А потом вводишь там же "php cookie" и опять же читаешь, вникаешь...


Спустя 4 минуты (8.07.2010 - 13:14) linker написал(а):
sergeiss, JS и куки тут видимо не помогут, если картинку генерит пхп, то и данные нужно сохранять в пхп (теже куки или сессии).

Спустя 26 минут, 17 секунд (8.07.2010 - 13:41) sergeiss написал(а):
linker - ты сам понял, что сказал???
Цитата (linker @ 8.07.2010 - 14:14)
JS и куки тут видимо не помогут, если картинку генерит пхп, то и данные нужно сохранять в пхп (теже куки или сессии).

Куки - они не в ЖС или ПХП, они у юзера на компе! ЖС или ПХП только пишут или читают их. Одни и те же куки!!! И они, т.е. куки, как раз для того и нужны, чтоб данные хранить некоторое время либо обмениваться данными таким образом между ЖС и ПХП.

Спустя 45 минут, 5 секунд (8.07.2010 - 14:26) linker написал(а):
sergeiss, это ты не понял. Пользователь зашел на страницу, ему пхп отдал картинку и сохранил в куках/сессию какие-то координаты, далее по будильнику JS вызывается опять пхп, который берет координаты из куков/сессии и строит новую картинку и сохраняется новые координаты в куках/сессии.
Читайте, ответственность за сохранение координат в данном случае должен нести пхп, а JS должен только по будильнику толкать пхп.
Все элементарно и проще некуда.

Спустя 14 минут, 59 секунд (8.07.2010 - 14:41) sergeiss написал(а):
linker - я-то как раз поняли и автора темы, и свои ответы. А вот ты - не понял меня.
Повторяю. В данном случае требуется что? Чтобы при перезагрузке страницы, иницииируемой JS, были переданы данные на сервак. Вот я и предлагаю СНАЧАЛА ЗАПИСАТЬ В КУКИ НОВЫЕ УНИКАЛЬНЫЕ ДАННЫЕ, а потом уже делать перезагрузку. После чего, в процессе формирования новой страницы, ПХП эти данные считает и использует.

Цитата (linker @ 8.07.2010 - 15:26)
Читайте, ответственность за сохранение координат в данном случае должен нести пхп

Понимаешь ли... Ну не может ПХП взять данные у клиента, не может!!! Потому что он только на сервере работает. JS должен ему эти данные подготовить. Потому что JS как раз у клиента находится.

А теперь включи здравый смысл и логику, перечитай еще раз, что я говорил ранее.

Спустя 15 минут, 19 секунд (8.07.2010 - 14:56) linker написал(а):
Цитата
Вот я и предлагаю СНАЧАЛА ЗАПИСАТЬ В КУКИ НОВЫЕ УНИКАЛЬНЫЕ ДАННЫЕ, а потом уже делать перезагрузку

В корне неверно, если бы JS строил картинку, тогда да, но в данном случае картинку строит PHP, а значит ему и отвечать за сохранение данных.
Цитата
онимаешь ли... Ну не может ПХП взять данные у клиента, не может!!! Потому что он только на сервере работает. JS должен ему эти данные подготовить. Потому что JS как раз у клиента находится.

и условие ТС
Цитата
Пользователь заходит на сайт и видит картинку, которую сгенерировал РНР-код.

Так кто должен сохранять результаты своей работы JS или PHP? Тот кто строит или тот кто толкает PHP?
Цитата
Ну не может ПХП взять данные у клиента, не может!!!

Это вообще убило ohmy.gif , $_SESSION[], $_COOKIE[]

Собственно алгоритм:

1. Пользователь заходит на страницу.
2. Выполняется PHP-скрипт, который генерит картинку и сохраняет координаты в куки/сессию (массив тупо serialize()wink.gif
3. По таймауту выполняется JS (ajax или тупо рефрешь всей страницы), который толкает PHP.
4. PHP-скрипт берет данные из кука/сессии (unserailize(); ), строит новую картинку, добавляет новые координаты и пихает обратно в куки/сессию (serialize()wink.gif
5. переход на п.3.

Спустя 37 минут, 15 секунд (8.07.2010 - 15:33) sergeiss написал(а):
Цитата (linker @ 8.07.2010 - 15:56)
Это вообще убило, $_SESSION[], $_COOKIE[]

Почитай, что такое сессия и где она хранится... Про куки я тебе сам же и говорю, а ты от них "отбрыкиваешься" всеми конечностями smile.gif

А теперь еще раз настойчиво прошу: ВКЛЮЧИ ЗДРАВЫЙ СМЫСЛ!!! И вникни в написанный тобой алгоритм. Особенно в п.2.
Цитата (linker @ 8.07.2010 - 15:56)
1. Пользователь заходит на страницу.
2. Выполняется PHP-скрипт, который генерит картинку и сохраняет координаты в куки/сессию (массив тупо serialize()
3. По таймауту выполняется JS (ajax или тупо рефрешь всей страницы), который толкает PHP.
4. PHP-скрипт берет данные из кука/сессии (unserailize(); ), строит новую картинку, добавляет новые координаты и пихает обратно в куки/сессию (serialize()
5. переход на п.3.


Как только пользователь что-то изменит, то как ПХП об этом узнает-то? Я говорю о том, что JS должен записать что-то в куки, а ты категорически против этого.

Спустя 9 минут, 5 секунд (8.07.2010 - 15:42) linker написал(а):
Цитата
Почитай, что такое сессия и где она хранится...

Какая разница где оно хранится, главное что она уникальна для каждого пользователя и данные из нее доступны PHP для перегенерации картинки.
После того, как юзверь ушел с сайта, эти данные удаляются см. тз топикстартера.
Цитата
мой пункт 2
2. Выполняется PHP-скрипт, который генерит картинку и сохраняет координаты в куки/сессию (массив тупо serialize())

А что вас тут смущает? Что-то из ряда вон выходящее? PHP не имеет GD? Или незнакомая функция serialize()? Или PHP не умеет работать с куками/сессиями?
Цитата
Как только пользователь что-то изменит, то как ПХП об этом узнает-то? Я говорю о том, что JS должен записать что-то в куки, а ты категорически против этого.

Что пользователь изменит? По ТЗ товарища MoZart.Element пользователь сидит на странице и тупо смотрит как меняется картинка. Можно поконкретнее, что вас ставит в тупик?

Спустя 52 минуты, 59 секунд (8.07.2010 - 16:35) MoZart.Element написал(а):
Цитата (sergeiss @ 8.07.2010 - 11:41)
В данном случае требуется что? Чтобы при перезагрузке страницы, иницииируемой JS, были переданы данные на сервак. Вот я и предлагаю СНАЧАЛА ЗАПИСАТЬ В КУКИ НОВЫЕ УНИКАЛЬНЫЕ ДАННЫЕ, а потом уже делать перезагрузку. После чего, в процессе формирования новой страницы, ПХП эти данные считает и использует.

Дело в том, что РНР на текущем шаге ещё не знает текущих координат. Он их вычисляет перед тем, как изображение создать. А вот все предыдущие уже должны храниться в куках, откуда их и требуется считывать РНР для генерации изображения. Если я всё правильно понял, то единственной сложностью будет преобразование массива данных в строку для сохранения в куки и разбор строки при считывании из куков. нельзя ошибиться.
А JS только запускает РНР-обработчик на исполнение.

Спустя 4 минуты, 22 секунды (8.07.2010 - 16:40) MoZart.Element написал(а):
Повторюсь, если я правильно понял алгоритм работы, описаный здесь http://www.poiu.ru/lessons/index.php-11.htm
то функция
setcookie(имя куки, значение, срок годности, информация о пути, домен, защищенность)
позволяет записывать куки, а чтение куки производится по имени
echo $my_cookie;

Спустя 18 минут, 8 секунд (8.07.2010 - 16:58) MoZart.Element написал(а):
Цитата (sergeiss @ 8.07.2010 - 12:33)
Как только пользователь что-то изменит, то как ПХП об этом узнает-то? Я говорю о том, что JS должен записать что-то в куки, а ты категорически против этого.

Уважаемые эксперты.
В данном случае пользователь ничего не изменяет, от просто на страницу заходит. А дальше периодическая работа РНР. Я уже примерно представил алгоритм, сейчас реализовываю.
Алгоритм такой:
1.
  • Пользователь зашёл на страницу.
  • Запустился РНР-скрипт.
  • Так как куки ещё нет, то ничего не считываем.
  • Проводим вычисления, получаем точку 1,записываем её в массив М.
  • Полученные числа конкатенируем в строку с разделителями и эту строку записываем в куки.
  • Генерим картинку по полученному массиву М и отдаём её в браузер.

2.
  • Через таймаут JS запускает обновление картинки, вызывается тот же РНР-скрипт.
  • Считываем куки.
  • Разбираем строку значения куки на составляющие, получаем последовательность чисел, забиваем их в массив М.
  • Проводим вычисления, получаем точку 2,записываем её в массив М.
  • Полученные числа конкатенируем в строку с разделителями и эту строку записываем в куки.
  • Генерим картинку по полученному массиву М и отдаём её в браузер.

Единственно, возникает вопрос: длина значения куки чем-нибудь ограничена?
Если да, то надо создавать массив куков, если это возможно для одного сайта.

И ещё вопрос, как проще и корректнее всего разобрать строку вида 111&222 на числа 111 и 222? Можете ссылочку подкинуть?

Спустя 1 час, 54 минуты, 18 секунд (8.07.2010 - 18:52) sergeiss написал(а):
Ну, ежели юзер ничего не мацает, а только смотрит... То тогда linker прав smile.gif

Но если юзер должен хоть как-то повлиять, то тогда мой алгоритм надо использовать wink.gif

Цитата (MoZart.Element @ 8.07.2010 - 17:40)
Повторюсь, если я правильно понял алгоритм работы, описаный здесь http://www.poiu.ru/lessons/index.php-11.htm
то функция
setcookie(имя куки, значение, срок годности, информация о пути, домен, защищенность)
позволяет записывать куки, а чтение куки производится по имени
echo $my_cookie;

Для ЧТЕНИЯ куки используется глобальный массив $_COOKIE!!! А echo используется только для вывода информации в браузер.

Спустя 13 часов, 30 минут, 28 секунд (9.07.2010 - 08:23) MoZart.Element написал(а):
Цитата (sergeiss @ 8.07.2010 - 15:52)
Для ЧТЕНИЯ куки используется глобальный массив $_COOKIE!!! А echo используется только для вывода информации в браузер.

То есть обращение к куки выглядит так: $X = $_COOKIE[my_cookie] ?

Спустя 11 дней, 16 минут (20.07.2010 - 08:39) MoZart.Element написал(а):
Уважаемые эксперты!
Возникла проблема...
Суть вот в чём:
  • пользователь зашёл на сайт на страницу 1 (Листинг ниже)
  • так как куки ещё нет, то всё ок - запускается рнр-скрипт(Имеется ввиду другой обработчик, который генерит изображение), генерит картинку, записывает куки.
  • затем пользователь решает на том же сайте посетить другую страничку 2. куки при этом, как я понимаю, не удаляются.
  • теперь пользователь решил вернуться на страницу 1. Для корректной работы алгоритма куки надо обнулить. использую для этого
    setcookie ('cookie');
    Однако куки не обнуляются.
Что не так и как поступить?
Листинг страницы 1
<?php
if ($_COOKIE['cookie'])
{ setcookie ('cookie'); }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<
html>
<
head>
<!--
Заголовок окна -->
<
title>ывапрол.</title>
<!--
Подключаем внешние скрипты -->
<
script src="http://www.navtest1.ru/js/func.js"></script>
<!--
Используем русскую кодировку -->
<
meta http-equiv="content-type" content="text/html; charset=Windows-1251">
<!--
Подключаем стилевые файлы -->
<
link rel="stylesheet" type="text/css" href="styles/stylenavtest1.css">
</
head>
<
body onload="StartUpdateTheImage('im_Main', 5000)">
<!-- ********************************************************** -->

<?php
require("header2.php");
?>
<!-- ********************************************************** -->
<
td>
<!--
Описание текста центральной ячейки -->
<
img id="im_Main" alt="Рувапролшщ."
src="data/dt_05/imcreate_05.php"
width="581" height="581" hspace="10" vspace="10" border="0">
<!--
Конец описания текста центральной ячейки -->
</
td>
<?php
require("footer.php");
?>

Листинг обработчика imcreate_05.php
<?php
if ($_COOKIE['cookie'])
{
$Status = "yes";
$cookie = $_COOKIE['cookie'];
}
else
{ $Status = "no"; }
$rnd = $_REQUEST['rnd']; //Это случайное число для против кэширования. Используется также для тестирования.
header ("content-type: image/png");
$img = imagecreate (581,581) or die ("Не удаётся инициализировать новый поток изображения.");
$bgcolor = imagecolorallocate ($img, 0, 0, 0); // фоновый цвет
$LScolor = imagecolorallocate ($img, 0, 255, 100); // цвет линий шкалы
$textcolor = imagecolorallocate ($img, 233, 14, 91);// цвет текста
$fn = 3; // Номер шрифта
$fh = imagefontheight($fn); // высота шрифта
$fw = imagefontwidth($fn); // ширина шрифта
//Рисуем линии

imageline ($img, 5, 290, 575, 290, $LScolor);
imageline ($img, 290, 5, 290, 575, $LScolor);
//Рисуем значения шкал линий
imagestring ($img, $fn, 293, 20, "0", $LScolor);
imagestring ($img, $fn, (560 - (2 * $fw) - 1), 290, "90", $LScolor);
imagestring ($img, $fn, (290 - (3 * $fw) - 1), (560 - $fh), "180", $LScolor);
imagestring ($img, $fn, 23, (290 - $fh), "270", $LScolor);
//Выводим текст
imagestring ($img, 1, 5, 5, "Designed by MoZart", $textcolor);
imagestring ($img, 1, 5, 15, "Used COOKIE", $textcolor);
imagestring ($img, 1, 5, 25, "Status", $textcolor);
imagestring ($img, 1, 50, 25, $Status, $textcolor);
imagestring ($img, 1, 5, 35, "cookie", $textcolor);
imagestring ($img, 1, 50, 35, $cookie, $textcolor);
imagestring ($img, 1, 5, 45, "rnd", $textcolor);
imagestring ($img, 1, 50, 45, $rnd, $textcolor);
//записываем куки
setcookie ('cookie', $rnd);
//Выводим изображение в браузер
imagepng ($img);
?>

Листинг фукции ЖС
function StartUpdateTheImage(imname, updtime) {
var img = document.getElementById(imname);
if (!img) return;
var src = img.src; // исходный урл
// если там уже есть вопрос, то &rnd= иначе ?rnd=

src += (src.indexOf('?') >= 0 ? '&' : '?') + 'rnd=';
setInterval(function(){
img.src = src + Math.floor(Math.random() * 1000000);
}, updtime); // через updtime мс.
}

Спустя 3 часа, 3 минуты, 47 секунд (20.07.2010 - 11:42) Joker написал(а):
Цитата (MoZart.Element @ 20.07.2010 - 10:39)
Для корректной работы алгоритма куки надо обнулить. использую для этого
setcookie ('cookie');
Однако куки не обнуляются.

setcookie ('cookie','',-1);

Спустя 49 минут, 58 секунд (20.07.2010 - 12:32) MoZart.Element написал(а):
Пробовал, не помогает.

Спустя 1 час, 4 минуты, 11 секунд (20.07.2010 - 13:37) linker написал(а):
Я так и не понял, почему алгоритм вдруг перестанет правильно работать, если юзверь перешел на другую страницу, а потом вернулся.

Спустя 24 минуты, 37 секунд (20.07.2010 - 14:01) MoZart.Element написал(а):
При каждом обращении к "генератору изображения" (рнр-скрипт imcreate_05.php) будут происходить определённые вычисления (естесственно, их сейчас нет в листинге) эти вычисления происходят с интервалом в 5 сек. На выходе этих вычислений координаты точки на рисунке (белая точка) и результирующие координаты точки на рисунке (красная точка). Белые точки вычисляются при каждом обращении и складываются в куки, а красная точка вычисляется каждый раз на основании текущего и всех предыдущих вычислений.
Если пользователь ушёл со страницы, а потом снова на неё зашёл, оставаясь всё время на сайте, то необходимо обнулить историю белых точек (то есть куки), иначе положение красных будет некорректным в связи с алгоритмом вычислений.
Поэтому и надо обновить куки!

Спустя 1 час, 10 минут, 55 секунд (20.07.2010 - 15:12) linker написал(а):
А в чем неправильность таки будет? Ну ушел, потом вернулся, данные-то сохранены, вот и строй новую картинку.

Спустя 55 минут, 31 секунда (20.07.2010 - 16:08) MoZart.Element написал(а):
Может быть не стоит обсуждать ТЗ?
Алгоритм вычислений будет работать некорректно. Точка!
Нужно обнулить куки. Точка!
Показанный мною выше метод ПОЧЕМУ-ТО не работает?
Вопрос - почему?

Единственная мысль... Генератор изображения находится в папке "ниже", чем скрипт страницы, из-под которого пытаюсь обнулить куки. Если причина в этом, то как это обойти?

Спустя 16 часов, 39 минут, 48 секунд (21.07.2010 - 08:47) linker написал(а):
Ну попробуй setcookie('cookie', '', time() - 1); А вообще, если у тебя ошибка в алгоритме, то ТЗ тут ни причем, потому и пытаюсь докопаться.

Спустя 6 часов, 2 минуты, 12 секунд (21.07.2010 - 14:50) MoZart.Element написал(а):
Ладно, этот трабл я обошёл, по-тупому через использование всё того же случайного числа.

Теперь другой вопрос.
Вот скрипт, к которому происходит обращение каждые 5 сек (только то, что важно).
<?php
header ("content-type: image/png");
//Получаем случайное число
$rnd = $_REQUEST['rnd'];
//Если его ещё нет - обнуляем куки
if ( !$rnd )
{ setcookie ( 'GloXA', '', -1 ); }

//Проверка наличия куки
if ( !$_COOKIE['GloXA'] )
{
$Status = "no";
$GloXA = array();
}
else
{
$Status = "yes";
$GloXA = unserialize ( $_COOKIE['GloXA'] );
}

$GloXA[] = $rnd;

$img = imagecreate (581,581) or die ("Не удаётся инициализировать новый поток изображения.");
$bgcolor = imagecolorallocate ($img, 0, 0, 0); // фоновый цвет
$textcolor = imagecolorallocate ($img, 233, 14, 91);// цвет текста
$vpos = 5;
imagestring ($img, 1, 480, 5, "GloXA", $textcolor);
foreach ($GloXA as $i => $value)
{
imagestring ($img, 1, 520, $vpos, $value, $textcolor);
$vpos += 10;
}

//Запись в куки
$GloXA = serialize ( $GloXA );
setcookie ( 'GloXA', $GloXA);

//Выводим изображение в браузер
imagepng ($img);
?>

И вот в чём проблема. Как я понимаю должно быть следующее: когда появляется кука, она считывается, восстанавливается в массив, к этому массиву присоединяется ещё один элемент, затем снова сворачивается в строку и записывается в куку. Это так должно быть. На деле имею следуюшее: кука просто переписывается текущим значением $rnd.
Почему так происходит?

Спустя 5 минут, 34 секунды (21.07.2010 - 14:55) linker написал(а):
не забываем время жизни ставить для куки, думается мне у тебя ни чего не работает исключительно по этой причине
setcookie('GloXA', $GloXA, time() + 3600);

Спустя 21 минута, 31 секунда (21.07.2010 - 15:17) MoZart.Element написал(а):
Цитата (linker @ 21.07.2010 - 11:55)
не забываем время жизни ставить для куки, думается мне у тебя ни чего не работает исключительно по этой причине
setcookie('GloXA', $GloXA, time() + 3600);

Почему именно time() + 3600 ?
Ведь, если время жизни не указывается явно, кука должна жить пока сайт не закрыт, не так ли? А так, получается, что она ещё час существовать будет. Зачем?
Может проблема в работе функций serialize/unserialize ?

Спустя 9 минут, 23 секунды (21.07.2010 - 15:26) linker написал(а):
Это просто пример. Serialize/unserialize нормально должны работать. Еще раз повторяю, удаляй куки так setcookie('cookie', 'ddd', time() - 1);

Спустя 24 минуты, 19 секунд (21.07.2010 - 15:50) MoZart.Element написал(а):
Это проблему не решает!
Не дописывается следующий элемент, когда я сижу на странице, то есть куки в этот период не удаляются!

Спустя 53 минуты, 8 секунд (21.07.2010 - 16:44) MoZart.Element написал(а):
У меня такой ещё вопрос:
Если удалять куки во время работы сайта, она удаляется полностью или только обнуляется и существует с пустым значением???

Спустя 1 день, 15 часов, 21 минута, 24 секунды (23.07.2010 - 08:05) linker написал(а):
Пробуй
$array = unserialize(stripslashes($_COOKIE['cookie']));
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.