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