Отправляет email-рассылки с помощью сервиса Sendsay

Все о PHP и даже больше

  Все выпуски  

Все о PHP и даже больше #12


Информационный Канал Subscribe.Ru

Все о PHP и даже больше...

.:: Путь от начинающего до эксперта ::.

# 12
8/2003

18 мая 2003г.

Проект сайта GreatWeb.RU

Ведущий рассылки: Бабушкин Евгений

    В этом выпуске:

  • Наши проекты
  • Реклама
  • СЕССИИ - обучение и /правильное/ использование. Часть 2
  •   Ссылки Вебмастеру:

  • Лучший хостинг
  • Раскрутка
  • Советы Web-мастеру
  • Книги по программировании
  • WEB-браузеры
  • Фоны
  • Скрипты
  • Лучшие Рассылки
  • Партнерская программа
  • DwebHost.RU

  • Привет программер!

    :.:: Наши проекты:

     

    GreatWeb.RU - Портал продвинутых юзеров. Только здесь все о веб-дизайне, раскрутке, выбору хостинга и не только...
    Читайте здесь последние новости интернета!

    Форум продвинутых юзеров. Отличный форум! Задавайте абсолютно любые вопросы, вам обязательно ответят и помогут решить Ваши проблемы.
    Самым активным пользователям будет выделен красивый почтовый ящик на 5 mb. Ваше_имя@greatweb.ru


    Совсем недавно мы открыли новую, уникальную рассылку: "Интернет-новости. Будь в курсе!". Читайте описание:

    Вы хотите быть в курсе ярких событий интернета? Тогда эта рассылка для вас!
    Принципиальные отличия нашей рассылки от других:
    первое и самое главное - мы публикуем самую интересную международную и
    российскую информацию об интернете, которая достойна вашего внимания;
    и второе, не менее важное - наши новости представляют собой легко
    читаемый текст, понятный не только специалистам, но и всем,
    кто интересуется компьютерами и интернетом.

    Подписаться на рассылку можно здесь.

     
    .:: Реклама:



    Сенсация! Никогда ещё рынок FOREX не был так доступен!
    Забудьте про фундаментальный и технический анализ, установите программу Investor's Dream, которая всего за 10 секунд проанализирует рынок и даст Вам рекомендации, покупать или продавать валюту! Вам не нужно не то что знать - думать о том, куда идет рынок. Вы знаете одно: куда бы рынок не решил пойти - вы пойдете в том же направлении. Подробнее...


    Если Вы хотите опубликовать свою рекламу в этой рассылке, пишите на admin@greatweb.ru


    .:: СЕССИИ - обучение и /правильное/ использование. Часть 2


    Как устроены сессии: передача идентификатора


    Двумя главами выше вы установили, что для нашей мечты нужно передавать идентификатор от отного вызова программы к другому. Давайте подумаем, какими способами можно что либо передать. В нашем случае мы установили, что надо передавать идентификатор сессии - строку из букв и цифр длиной 32 символа. Отвлекитись от всего и подумайте, как можно передавать какую-то строку от скрипта к скрипту.

    Способ 1: Cookies

    Это самый популярныи и работающий по умолчанию способ передачи идентификатора. Можно один раз поместить в куку переменную и все остальные скрипты будут ее получать. Если у пользователя куки включены, PHP сам поместит туда идентификатор и потом сам его от туда достанет. О том, как PHP узнает о включенности кук - в следующей главе. В этом способе в куках создается переменная с изветным именем (по-умолчанию: PHPSESSID) и значением идентификатора (например: ac4f4a45bdc893434c95dcaffb1c1811).

    Хорошо: куки (cookies) - это самый простой способ закрепить за посетителем какие-либо данные. Трудно стереть куку или изменить.
    Плохо: куки могут быть выключены. Зайдите на Спайлог да узнайте, каков % посетителей не смогут работать с вашим сайтом.

    Способ 2: параметры - http://php.spb.ru/test.php?PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811

    Если вы будете дописывать все ваши ссылки подобным образом, то все ваши последующие скрипты получат идентификатор. PHP использует и данный метод по умолчанию (совмещая с куками, если те выключены). Т.е. PHP _сам_ применит либо куки, либо способ 2. PHP сам после работы вашей программы проанализирует ее страницу для браузера и позаменяет все ссылки так, чтобы дописать переменную PHPSESSID.

    Хорошо: 100% надежный способ. Легко передавать во всех ссылках номер сессии (это нагрузка, но она очень простая, поэтому - хорошо).
    Плохо: любой чайник может переделать номер сессии или удалить ее. Т.к. в принципе нет способа надежной привязки посетителя к номеру - беда небольшая. Злой сосед по компьютеру может украсть номер из URL (32 символа). Но если сделать URL подлиннее (test.php?_________....______&PHPSESSID=12345678), то сосед ничего не увидет. Строка "Адрес" в браузере не бесконечная :-))


    Способ 3: PathInfo - http://php.spb.ru/test.php/ac4f4a45bdc893434c95dcaffb1c1811

    Это основано на понимании Апачем того, где из этого URL путь к скрипту, а где параметры. Т.е. Апач распознает данный вызов, как обращение к файлу test.php и передаст любую произвольную строку в переменной $pathinfo=getenv("PATH_INFO") - так ее можно взять и получить от туда идентификатор запроса. Соответственно, чтобы передать управление в другой скрипт, надо подобным образом составить URL (GET-запрос) или передать форму GET или POST запросом.

    Хорошо: ничего хорошего.
    Плохо: трудно ссылаться на локальные скрипты и картинки. Чтобы все работало, придется в программах и тегах картинок использовать абсолютный путь на сервере.

    Способ 4: rewrite, виртуальный каталог - http://php.spb.ru/ac4f4a45bdc893434c95dcaffb1c1811/test.php

    С помощью стандартного модуля rewrite можно огранизовать подобного рода виртуальный каталог. Если написать произвольный путь - Апач возьмет скрипт test.php из фиксированного каталога. В скрипте придеться проанализировать переменную $url=getenv("REQUEST_URI"); и взять из нее идентификатор. Далее по нему PHP восстановит нужную сессию.

    Хорошо: все хорошо. Легко работать, в отличии от способа 3. Не нужно передать идентификатор - сам собой передастся.
    Плохо: ничего плохого. Немного надо написать и немного настроить rewrite. Чтобы позволить кешировать картинки, путь к ним надо писать обсолютный.

    Способ 5: DNS, виртуальный сервер - http://ac4f4a45bdc893434c95dcaffb1c1811.php.spb.ru/test.php

    Можно настроить DNS так, чтобы по любому подобному пути произошло бы обращение к вашему веб-серверу. В самом сервере с помощью алиаса "*.php.spb.ru" задать, что эти адреса принадлежат главному серверу php.spb.ru. Далее по описанной выше схеме из переменной $host=getenv("HTTP_HOST"); достаем идентификатор и передаем в PHP. После чего тот достает нужную сессию.

    Хорошо: все хорошо. Совсем ничего не надо делать, по сравнению с виртуальным каталогом.
    Плохо: злой сосед может срисовать номер сессии. И ее уже не запрятать за правый край строки "Адрес". Но это не страшно, т.к. ситуация со злым соседом весьма редкая. Чтобы позволить кешировать картинки, путь к ним надо писать обсолютный (ссылаясь на главное имя сервера).

    Способ 6: фиктивный логин - http://ac4f4a45bdc893434c95dcaffb1c1811@php.spb.ru/test.php

    Зеркально похож на способ виртуального каталога. В прессе ранее не не упоминался :-) Придумался сам собой, пока писал эту стать. Хоть и не оригинальная идея, но реальная для использования. Для тех, кто не в курсе, URL состоят из следующего вида:

    • Название протокола (http)
    • Имя пользователя (логин)
    • Пароль
    • Имя сервера
    • Порт
    • Путь к скрипту, минимум - содержит "/"
    • Якорь на странице (read.html#якорь)

    Получается - http://логин:пароль@ИмяСервера:порт/путь#якорь . Если пароль не указывают, получается http://логин@сервер, где слово логин может быть любым. К примеру, на этом основаны регулярно появляющиеся шутки типа http://www.microsoft.com@195.63.2.95/doc/windows_must_die.txt, где пишут разные приколы, подделав дизайн под нужный сайт. Есть и полезное свойтво - если чайник от незнания напишет в браузере адрес dima@mail.ru, то он попадет на главную страницу почтовой системы.

    Еще можно простараться впихать идентификтаор в якорь, только это не имеет смылса, т.к. способ ничем не отличается от "способа 2".


    Промежуточный итог, характеристика сессий

    В самом начале мы описали персональную область данных, которой так нехватает веб-программисту, чтобы хранить что либо. Далее, мы установили, что PHP надо только сообщить названия переменных. После этого ПХП присвоит всем посетителям идентификаторы (число 128 бит), которое невозможно подделать, откроет на диске файл, названный аналогично номеру сессии для хранения информации. Данные там запаковыны с помощью функции сериализации, т.е. наипростейшим способом. Чтобы наш сайт успешно работал, мы должны позаботиться о передаче идентификатора от запроса к запросу. Делать это можно разными путями. БОльшую часть работы ПХП делает сам. И так, после вводной части (наша мечта -> реальность с четкими задачами) посмотрим, что проиход по умолчанию.

    Читайте данную главу особенно внимательно, здесь описано поведение ПХП по умолчанию и что требуется от программера в особых случаях (если куки у посетителя отключены, но юзать сессии хочеться). Поведение ПХП при нестандарных параметрах описано ниже.

    Представьте, посетитель обратился к одной из страниц вашего сайта. ПХП прочел файлы конфигурации. Интерпретатор ПХП начинает выполнять ПХП-файл. Если он там не встретит команду session_register() или session_start() , то никакие сессии работать не будут. Если бы ПХП обнаружил параметр настройки session.auto_start равный 1, то сессии стартовали бы без нашей команды (по умолчанию данный параметр содержит 0 - выключено).

    В нашей программе (мы работаем с сессиями) эти строчки будут одними из первых, что обработаются ПХП-процессором. Поэтому можно считать, что поддержка сессии запуститься при старте скрипта.

    Что входит в понятие запуск сессий. ПХП пытается выяснить, новый это посетитель или нет. Если новый - надо выдать ему новое случаное число и создать файл под хранение сесии, если старый - взять его идентификатор и извлеть из соответствуюего файла переменные сессии. Возможно, посетитель будет иметь номер несуществующей сессии. Тогда он приравнивается к новому посетителю.

    Алгоритм извлечения идентификатора. Из настроек сервера известно, что имя переменной, хранящей идентификатор - PHPSESSID (можно задать произвольное).

    1. Если идентификатор будет найден в куках, то пользователь считается идентифицированным и использующи куки: повторно кука не устанавливается, URL не подвергаются автозамене (о автозамене чуть ниже).
    2. Если идентификатор найден в URL (GET-запрос) или в POST-запросе и не найден в куках, то пользователь считается идентифицированным и не использующем куки: кука выставлятся (на всякий случай), URL проходят автозамену, чтобы вставить в них идентификатор.
    3. Если идентификатор не найден ни в куках, ни в URL, то пользователь считается новым, используется ли он куки - не известно, происходит выделение нового случайного идетификатора и установка в куки, автозамена всех URL.
    Таким образом, можно определить поведение ПХП:
      При первом визите человека на ваш сайт ПХП не находит идентификатора; он устанавливает куку и производит автозамену всех URL и форм. При втором и последующем обращениях, если у человека включены куки, то ПХП будет каждый раз получать идентификатор из кук и соответветственно не будет производить повторной установки куки или автозаменять URL. Если при повторном посещении ПХП обнаружит идентификатор только в URL, то ПХП будет и далее пытаться установить куку и производить автозамену. Все это следует из приведенных выше 3-х правил.
    Алгоритм установки кук. После завершения первого алгоритма получается, что все пользователи становятся идентифицированными с каким-то номером - старым или новым. Если в предыдущей проверке выполнились 2 или 3 варианты, по ПХП устанавливает куку. Если выполнился вариант 1 - кука повторно не отсылается. Вы скорее всего когда либо работали с куками и знаете, что устанавить их можно только до вывода на экран какого-либо текста. Поэтому и надо писать команду session_start() в самом начале программы. Хотя, можно применить буферизацию вывода установив output_buffering в on. Тогда вы сможете стартовать сессии в любом месте программы, ставить куки и писать где угодно информацию в заголовок страницы (с помощью функции Header()).

    Алгоритм автозамены всех ссылок и форм. После того, как ПХП-программа закончит работу и до вывода результата браузеру, происходит автозамена ссылок. Вернее, ПХП решает, нужно ли ее производить. Если из вышеприведенных 3-х вариантов срабатывают 2-й или 3-й (либо посетитель новый, либо у него намерянно отключены куки), то ПХП производит автозамену. Автозамена всех ссылок такого типа:


    БЫЛО: <a href=test.php?a=1&name=Dima>click here</a>
    СТАЛО: <a href=test.php?a=1&name=Dima&PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811>click here</a>
    

    Подобным образом ПХП пытается вставить идетификаторы во все формы GET или POST запроса:


    БЫЛО: <form action=test.php> Имя: <input type=text name=nick value='$nick'> <input type=submit> </form><br> СТАЛО: <form action=test.php?PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811> <input type=hidden name=PHPSESSID value='ac4f4a45bdc893434c95dcaffb1c1811'> Имя: <input type=text name=nick value='$nick'> <input type=submit> </form>

    Данная автозамена происходит без вашего участия, ПХП сам решает когда нужно заменять и сам пытается встроить идетификатор посетителя, чтобы не потерять его. Таким образом, если вы будете делать нормальные страницы, содержащие ссылки и формы, ПХП постарается все позаменять. Однако, если вы постараесь ему помешать, например, вставляя HTML-теги с помощью функции javascript:document.write(), то ПХП явно не станет анализировать эти скрипты. Короче говоря, ПХП не гарантирует вам 100% замены всех ссылок и форм, но работает он очень хорошо.

    Чтобы автоматичиская замена URL работала, убедитесь, что ПХП скомпилирован с опцией --enable-trans-id. Если на вашем сайте не поисходит автозамены - перекомпилируйте свой ПХП. Обычно ПХП компилируют с минимальным количеством параметров и указанного паратра там нет. Если ваш сервер очень нагружен, по подумайте, стоит ли вообще включать автозамену URL (скорее всего вы можете себе это позволить, т.к. на подовляющем большинстве серверов процессор в среднем загружен только на 5-10%).

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

    Если вы хотите поддерживать работу сайта с отключенными куками но не хотите, чтобы ПХП автоматически заменял ссылки и формы, либо если ПХП на какой-то конкретной ссылке/форме глючит и не вставляет идентификатор, проделывайте это вручную. Это очень просто. Для начала отпределим новую константу SIDFORM (после session_start()):


    define ("SIDFORM","<input type=hidden name=".session_name()." value=".session_id().">");

    Представим, что у нас есть ссылки и формы (еще бывают фреймы и теги типа AREA, но там делают аналогично). С помощью двух констант SID - определена в ПХП и SIDFORM - придумали сами себе, переработаем текст:


    ------------------БЫЛО (ПХП-файл)------------------ Ссылка: <a href=test.php?a=1>click here</a> ... Форма: <form action=test.php> .... </form> ------------------МЫ ЗАМЕНЯЕМ НА (новая версия ПХП-файла)------------------ Ссылка: <a href=test.php?a=1&<?=SID?>>click here</a> .... Форма: <form action=test.php> <?=SIDFORM?> .... </form> ------------------РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ (это получит браузер)------------------ Ссылка: <a href=test.php?a=1&PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811>click here</a> .... Форма: <form action=test.php> <input type="text" name="PHPSESSID" value="ac4f4a45bdc893434c95dcaffb1c1811"> .... </form>

    Тоже самое будет и в ПХП-варианте: echo "<a href=test.php?e=2>click here</a>"; надо заменить на echo "<a href=test.php?e=2&".SID.">click here</a>";
    Обратите внимание, что SID - это константа. И если вы хотите иметь переменную $SID, то просто напишите в начале программы $SID=SID; (после старта сессий).

    Итак, подведем итог автозамене. Если вы не хотите вставлять идентификаторы - полагайтесь на ПХП, который постарается все ссылки заменить. Если вы хотите 100% надежность того, что все смогут использовать ваш сайт и ни один пользователь ни на одной старнице случайно не потеряет сессию, то прибавляйте к каждой форме и ссылке по небольшой константе (их можно названить очень коротко, типа "X" и "Y").



    Параметры и функции для сессий

    В данной главе приведено описаний сессий - это ФУНКЦИИ и одноименные НАСТРОЙКИ в php.ini или .htaccess. Функции от настроек отличаются тем, что у первых есть скобочки - функция(). Для тех, кто не в курсе. Вы можете настраивать сессии, задавая разные параметры в php.ini, httpd.conf или .htaccess файлах. В php.ini все переменные уже написаны и содержат какие-либо значения (их называют глобальными настройками), с помощью httpd.conf или .htaccess можно указать для какого-либо виртуального сервера или отдельного каталога локальные настройки ПХП. Для этого используют строку php_value Имя Значение. Обратите внимание, что использовать настройки можно только если ваш ПХП является модулем Апача. В противном случае (ПХП - не модуль, а отдельная CGI-программа) такая строка в .htaccess вызовет ошибку, как и любая неправильная строка.

    session_start()

    Запустить поддержку сессий в скрипте. Данная функция подробно была описана выше. Функцию можно не использовать, т.к. первая же session_register("НазваниеПеременнной") запустит сессии.

    session_destroy()

    Уничтожить:
    • все данные, хранящиеся в сессии
    • файл, отведенный для данных
    • переменные в программе и идентификатор посетителя
    Функция отменяет действие session_start(). Вызывать нужно после вызова session_start(). Можно применять, чтобы уничтожать сессиию пользователя, а потом сразу вызывать в программе второй раз session_start(), получиться совершенно новый посетитель с новым идентификатором и чистой сессией.

    session_name(), session.name, PHPSESSID

    ПХП для хранения идентификатора использует какую-то переменную В куку записывают переменную: значение переменной - идентификатор, название переменной - PHPSESSID. PHPSESSID - это название, которое используют по-умолчанию. Я рекомендую переименовать ее во что-либо короткое, например SID. А для этого надо заменить параметр session.name на значение SID:
    • можно заменить php.ini: session.name = SID
    • можно создать .htaccess файл в каталоге со скриптами вашего сайта и поместить строку php_value session.name SID
    После такого переименования получится, что константа SID содержит строку "SID=номер_сессии" (echo SID;), а переменная $SID только сам номер (echo $SID;). Для тех, кто не в курсе, константы в ПХП используют без символа доллара.

    Чтобы получить название переменной, которую используют для хранения идентификатора, что в свою очередь происходит из-за настроек, надо воспользоваться функцией без параметра $name=session_name()

    Чтобы установить такую переменную в произвольное название, воспользуйтесь функцией с параметром session_name("МоеНазвание"). Разумеется, если вам почему-то понадобилось изменить имя переменной для кук с помощью этой функции, то ее надо вызывать перед session_start() или session_register(), иначе, как не трудно догадаться, будет поздно что либо менять. К тому же, вы должны будете использовать эту функцию во всех своих скриптах, где требуется заменить "PHPSESSID" на "МоеНазвание".

    session_module_name(), session.save_handler

    Получить или установить текущий модуль сессии. ПХП может хранить сессии разном виде. По умолчанию - в файлах. См. так же session_set_save_handler().

    session_save_path(), session.save_path

    Получить или установить каталог, в котором будут храниться файлы сессии. $path=session_save_path() - получить. session_save_path("/mydir/temp"); - установить. Параметр session.save_path можно задавать в php.ini или .htaccess.

    session_id()

    Получить или установить идентификатор посетителя (128-битное число, представленное в виде строки в 32 байта). В нормальных условиях вам не нужно устанавливать номер сесии. Но если вы хотите для всех своих посетителей использовать одну сессиию, то перед session_start() придумайте любое имя (произвольная строка) - session_id("dima"); или получите настоящий идентификатор другим образом. Вызов функции без параметров вернет вам текущий номер сессии (в таком случае - вызвать после session_start()).

    session_register()

    Зарегистрировать одну или несколько переменных. Передавать надо имена переменных, а не сами переменные: session_register("переменная1", "переменная2", ...). Сама функция подробна описана выше.

    session_unregister()

    Выполнить обратно действие - удалить из сессии необходимую переменную. Можно передать только одно имя переменной за один вызов функции.

    session_unset()

    Очистить все переменные сессии. В отличии от session_destroy() сессия и идентификатор остается.

    session_is_registered()

    Проверить, зарегистрирована какая либо переменная в текущей сессии или нет: if (session_is_registered("МояПеременная")) ...

    session_get_cookie_params() и session_set_cookie_params()

    Получить информацию о куке, хранящей переемнную с идентификатором сессии. echo "<pre>SESSION INFO:\n"; print_r(session_get_cookie_params()); Так можно узнать о времени жизни переменной, домене и пути куки. session_set_cookie_params() - соотвественно переустановить параметры (хотя все эти параметры надо задавать в php.ini - см. ниже).

    session_decode() и session_encode()

    Раскодировать закодированную строку в сессию и получить закодированную строку сессии.

    session_set_save_handler()

    Возможно, вас не усраивают варианты хранения сессий, предлагающихся в ПХП. Может быть вы хотите хранить сессии в простых текстовых файлах, чтобы их можно было легко редактировать. Тогда вам нужно создать несколько функций, отвечающих за функционирование сессий и передать названия этих функций в session_set_save_handler() (чтобы пропустить какой либо параметр, передавайте пустую строку - ""). Если вы пишите что-не не стандарное, вам будет полезна фукнция. Описывать ее не буду, т.к. не использовал, да и в мануале есть полное описание и пример.

    session.auto_start

    По умочанию равно 0, сессии автоматически не запускаются. Если равно 1, то session_start() писать в начале каждого скрипта не нужно.

    session.cookie_lifetime

    Если равно 0 (по-умолчанию), то кука, хранящяя сессию, будет уничтожена на компьютера посетителя как только он закроет все окошки браузера. Если не нуль, то это задает число секунд для хранения куки.

    session.gc_maxlifetime

    Количество секунд, через которое ПХП уничтожит у себя на диске устаревший файл сессии. По умолчанию - 1440. Это произойдет НЕ РАНЕЕ кол-ва секунд, указанного в переменной. Данное время определяет нижнюю гланицу (НЕ РАНЕЕ), когда файл становится кандидатом на удаление. Верхняя граница определяется следующей переменной. Время отсчитывается от последнеого обращения посетителя т.е. это время доступа к файлу, а не создания. У любого файла есть время создания. модификации (запись) и доступа (чтение).

    session.gc_probability

    Число от 1 до 100, измеряемое в процентах (по умолчанию - 1, т.е. 1%), которое задает вероятность запуска механизма удаления старых файлов сессии. Другими словами, при каждом обращении посетителей к любой программе вашего сайта, использущей сессии, с вероятностью 1% произойдет поиск и удаление устаревших файлов сессии. Таким образом, по-умолчанию, вы на должны опасаться, что на сервере скопится огромное число мусора, и вам придется писать программу для его сбора. Только укажите желаемую частоту сбора. Не рекомендуется устанавливать 100%, т.к. ПХП будет при каждом обращении пользователя искать старые файла, что создаст лишнюю нагрузку. Разумный максимум для данной переменной - 5%, хотя лучше оставить как есть - 1%.

    session.use_cookies

    Использовать ли куки, для хранения идентификатора сессий или нет. По умолчанию - 1, можно использовать. Если равно 0, то ПХП ничего в куки записывать не будет, а будет пытаться все время автозаменять URL и формы.

    session.cookie_path

    Если на вашем сайте используется несколько разных программ (у каждой свои сессии) и вы не хотите, чтобы сессии случайно пересекались, то установить нужный путь для кук. Если установить session.cookie_path /programm1, то все ваши программы, расположенные в каталоге pogramm1 или его подкатлогах, будут иметь одно общее пространство для кук, что равносильно одной и тожей сессии. Если посетитель после каталога /programm1 зайдет в /programm2 (для которого тоже заведены отдельные куки), то он будт идентифицирован новой программой по новому. Если у вас на сайте всего одна программа или много программ, но на разных названиях серверов, то куки/сессии никак не пересекутся.

    session.cookie_domain

    Из той же области, что и предыдущая переменная. Для полного понимания ее работы читайте о куках. Такой документации на русском языке очень много.



    Приступим к работе с сессиями

    Для начала решим, как правильно должны начинаться наши скрипты и что мы собираемся хранить в сессиях. Предложение N1 - несколько строк, которые будут отвечать за правильный запуск сессий и обработки новых пользователей, которым надо записать какие-то переменные для начала пработы, хорошо бы поместить в отдельный файл. Итак, файл index.php будет главным на сайте, а описанные команды мы поместим в default.php.

    Предложение N2 - наша программа будет содержать много функций, в которых иногда будет происходить доступ к переменным сессий, следовательно последние надо будет делать глобальными в функциях. Если у нас будет десяток переменных, то нам придется писать большую строку для объявления переменных глобальными. Если же мы зарегистрируем в сессиях только одну переменную-массив с коротким названием, то нам будет легко ее прописывать глобальной и легко обращаться. Итак, предложение 2 - используем переменную $s, все необходимые параметры пишем в $s как в массив: $s[название]=значение.

    Что записывать всем пользователям по умолчанию? Давайте, при входе нового посетителя, будет объявлять переменную $s[start], в которой запишим время входа пользователя. Чтобы получить текущее время (число) используют time(). Больше ничего делать с новыми посетителями не надо. На главной страние мы будем выводить фразу "Добро пожаловать!", если человек впервые тут и фразу "Вы пришли к нам ?? секунд назад". Подсчитать кол-во секунд весьма просто: time() - текущее время, $s[start] - уже прошедшее (когда мы произвели запись $s[start]). Таким образом, надо от большего отнять меньшее. Пишем эту программу.

    Файл default.php:

    <? // до первой строки с "<?" вы не должны ставить пустые строки или пробелы // данный файл должен начинаться с "<?" // в тексте программ возможно любое кол-во пустых строк unset($s); // удаление переменной $s, если она вдруг была объявлена // чтобы никто не мог ничего через URL ничего записать // например, так: index.php?s[start]=... // сессии еще не запустились, поэтому мы удаляем не ту переменную $s, // что появиться после следующей строки session_start(); // включить поддержку сессий. Если человек новый, ему // выдадут случайный идентификатор. Но мы про это пока не // думает, а сразу приступаем к использованию сессии session_register("s"); // зарегистрировать переменную $s как переменную сессии // обратите внимание - пишем "s" в функции, а не $s // с этого момента вся информация в будущем массиве $s будет сохраняться ?>

    Файл index.php (или любой файл вашего будущего сайта)

    <? // до первой строки с "<?" вы не должны ставить пустые строки или пробелы include("default.php"); // подключаем файл default.php из текущего каталога (из того же, где и сам // index.php лежит) if (!isset($s['start'])) { // если выполнится это условие, т.е. переменной $s[start] еще несуществует, // то мы может произвести какие-то действия, пусть даже самые простые. // Используем переменную $s[start] как флаг и отсчет времени $s['start']=time(); // в переменную запишеться ненулевое положительное число // больше данный IF не выполниться, т.к. теперь и далее переменная // $s[start] существует (и дополнительно хранит полезное число) echo "Добро пожаловать на наш сайт!"; // выводим сообщение в знак того, что данный посетитель пришел // пришел впервые } else { // если выполниться это условие, то это старый посетитель // выводим для него соответствующую фразу и не производим // установку переемнных по умолчанию echo "Вы впервые пришли на наш сайт ".(time()-$s['start'])." секунд назад"; } ?>

    Обратите внимание, что программа при выключенных куках работать не будет. Для его работоспособности надо при первом обращении пользователя сделать header("Location: $PHP_SELF?".SID); (разумеется, при этом человек не увидет приветствие).

    На этом пока придеться закончить. Все свои вопросы Вы можете задавать на нашем форуме.

    Источник: php.spb.ru (Дмитрий Бородин)

    © 2002-2003 Copyright by GreatWeb Design
    Копирование материалов рассылки возможно только в случае явного указания на сайт "GreatWeb.RU" как на источник информации.



    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу

    В избранное