больше 
мой cms4site


cms4site™ система построения сайтов и управления контентом 3.6.2

 
RU . EN . DE . SK . K8
Начало . Контент . Модули . Администратор . Конвертеры . Центр Управления . Броузер . Статистика . Демо
64
 посмотреть php код движка сайта - 17,820 байт
посмотреть структуру сайта - 13,778 байт
 

СТРАШНАЯ ПРАВДА О COOKIES


Интернет наполнен одной и той же содранной друг с друга ерундой про Cookies - не более 300, с одного домена не более 20, 4 килобайта каждый и т.п.

Все на самом деле совсем не так:

  1. Cookies - это список вида "переменная=значение", разделенный знаками "; ". Соответственно, элемент этого списка - Cookie.
  2. Можно говорить по-русски "кукисы" и "кука", а то регистр переключать очень задалбывает.
  3. Более 4000 байт в кукисы не запихать. Имеется в виду тот объем, который доступен для передачи и приема по http. Никакие хитрости с доменом и количеством кук не помогают. Поэтому, не 20*4000=80000 а всего только 4000 байт. А что вы хотели? Каждый раз 80 килограмм отправлять туда-сюда?!!
  4. Зато, заглянув в windows\cookies мы увидим, что файлов там намного больше анонсированных 300. И чисткой этой помойки, похоже, никто не собирается заниматься.
  5. Кукисы хранятся в url-encoded формате. Из среды клиентского javascript доступны в "сыром" виде (как есть) по document.cookie, на серверной стороне при использовании php они уже раскодированы и распиханы в массив $_COOKIE, но есть и "сырой" вариант $_SERVER["HTTP_COOKIE"]. Не надо пугаться document.cookie=name+'='+value в javascript - оно обновляет не все, а только указанный name, ну это фишка такая от Майкрософт®...
  6. В javascript функция escape оставляет знак собаки, а в php rawurlencode - кодирует. С этим сами сражайтесь, если хотите с точностью до полубайта...
  7. Оптимально, видимо, перед записью в кукисы проверить, влезает ли и в случае превышения не пользоваться автоматическим обрезанием лишнего, выдав соответствующее сообщение.
  8. На всякий случай, лучше проверять даже не на 4000, а, например на 3900 - вдруг еще где-то какую-то мелочь на сайте забыли проверить.

В среде javascript (допуская, что есть функция getCookie и не учитывая собаку):

newlength = document.cookie.length;
quantity = document.cookie.split(';').length;
value = escape(value);
oldvalue = getCookie(name);
if (oldvalue!=null) newlength = newlength - (name + "=" + escape(oldvalue)).length;
else {
if (newlength>0) newlength = newlength + 2;
quantity++;

}

newlength = newlength + (name + "=" + value).length;
if (newlength<4000 && quantity<=20) document.cookie = name + '=' + value;
else ругаемся;

В php немного короче (собаку опять не учитываем, а ведь друг человека, все-таки...):

$length = strlen($_SERVER['HTTP_COOKIE']);
$quantity = sizeof($_COOKIE);
if (isset($_COOKIE[$name])) $length = $length - strlen($name.'='.rawurlencode($_COOKIE[$name]));
else {
if ($length>0) $length = $length + 2;
$quantity++;

}

$length = $length + strlen($name.'='.rawurlencode($value));
if ($length<4000 && $quantity<=20) setcookie($name,$value);
else ругаемся;

Предложенный способ радикально отличается от общепринятой проверки длины name=value при которой в один прекрасный момент грохается все.

 #TOP">
Copyright . Поиск . Карта . Документация . Изменения . FAQ . Лирика . Сайты . Письмо
©1996-2010 cms4site group. All rights reserved
Движок cms4site™
МИНЗДРАВ ПРЕДУПРЕЖДАЕТ: ЧРЕЗМЕРНОЕ УВЛЕЧЕНИЕ ИНТЕРНЕТОМ МОЖЕТ НАНЕСТИ ВРЕД ВАШЕМУ ЗДОРОВЬЮ!
Реконструкция дизайн - отделка фасадов камнем.