Создать страницу на php. Разработка многозадачных приложений на PHP V5 (исходники). Самая тривиальная ошибка

Как создать php файл?

Дата: 2010-09-08

Чем отличается php-файл от html-файла.

Создание автоматизированных сайтов, как Вы понимаете - это уже следующая ступенька в сайтостроении. Если простой сайт можно создать на обычном языке HTML, то автоматизированный сайт можно создать только с использованием PHP и очень часто с использованием баз (одной или нескольких) данных.

Но в основе web-страницы на PHP, лежит все таки язык HTML. А следовательно все правила создания страниц обоих типов общие. И я буду исходить из того, что Вы уже знакомы с HTML и знаете, как создаются простые web-страницы. Если не в курсе этого или же подзыбыли:) , то обновите свои познания в разделе . Отсюда вытекает очень важное правило: Все теги, которые мы изучали в разделе , так же прекрасно работают в php файлах и мы будем этими тегами пользоваться . Так что Вы должны знать HTML.

По своей структуре PHP файл напоминает обычный HTML файл, но со специальными вставками php кода. Эти вставки кода вставляются в код web-страницы с помощью специальных операторов, которые иногда еще называют дескрипторами :

Дескриптор .

Примечание: Иногда можно встретить сокращенную запись дескрипторов: . Рекомендуется избегать такой записи. Сценарий PHP записанный в сокращенном виде может работать не на всех серверах.

Когда сервер (или локальный сервер) встречает такую вставку, то подключается (установленный на сервере), PHP-код обрабатывается и пользователю (посетителю сайта), выдается уже обработанная и готовая web-страница. Именно поэтому если мы попытаемся посмотреть код php-страницы уже загруженной браузером (правая кнопка мыши, Посмотреть HTML-код), мы не увидим таких вставок (они уже обработаны сервером).

Создается php файл так же, как и html файл простым переименование расширения текстового файла и сделать это можно в обычном Блокноте . Про это мы уже беседовали в уроке: " поэтому не буду повторяться.

PHP файл имеет расширение .php . Первый файл, загружаемый по умолчанию, так же как и в HTML всегда называется index.php , но как Вы заметили имеет расширение .php . Все PHP файлы имеют вид имя.php , конечно же все имена файлов пишутся по английски.

Сервер, когда у него запрашивают такой файл (проще говоря нажимают на ссылку), уже "понимает", что в этом файле содержится php-код и его нужно обработать прежде чем отдать посетителю. HTML-код при этом просто пропускается сервером, точнее препроцессором PHP без обработки.

Давайте теперь рассмотрим простейший файл с php-кодом. Для определенности назовем его например name.php . Итак смотрим Листинг 1 :

Листинг 1.

Как видите код этого php-файл отличается от html-файла расширением .php (в имени файла) и вставкой php-кода Листинг 2 :

Листинг 2.

Оператор echo - переводится как вывести , в данном случае имеется ввиду вывести на экран монитора. Т.е. надпись Привет, меня зовут Иван просто отобразится на мониторе при запуске этого файла.

После вывода каждой команды ставится точка с запитой (; ) . Если команда одна, как у нас сейчас, точку с запитой можно не ставить, но если команд несколько, то точка с запитой должны ставиться после каждой команды , тогда это разделитель между командами. После точки с запитой считается, что команда выполнена. Кроме того это считается хорошим тоном при программировании на PHP.

В этом вводном уроке я познакомлю вас с нужными программами и расскажу, что нужны для роботы с PHP.

Что нужно знать

Также нужно знать как записывается PHP. В файле, PHP скрипт начинается со слова - . Все, что между это PHP код, запомните это.

Файлы, в котором записан PHP код нужно сохранять под расширением .php

Для того чтобы научится PHP (как и любому другому языку программирования) важно много практиковаться.
Когда вы будете читать уроки, то не копируйте код, а именно пишите сами, так будет лучше для Вас, так Вы быстрее запомните сам язык, и вам будет легче дальше.

Программное обеспечение

Первая программа, которая вам нужна, это браузер (то, в чем Вы сейчас находитесь:D)

Веб-сервер. Для локального тестирования вам нужно установить веб-сервер. Я рекомендую поставить Open Server (Mini версии будет достаточно). Как установить Open Server . Open Server является портативным, т.е. вам нужно только разархивировать скачанный архив и запустить сервер через Open Server.exe . После старта программы вы увидите красный флажок в трее Windows (область возле системных часов). Чтобы включить непосредственно сам веб-сервер нажмите на флажок, далее выберите пункт меню Запустить.


Начиная писать программы для веба, многие начинающие программисты сталкиваются с такой ошибкой. Они рассматривают систему браузер-сервер, как обычное приложение. Интерактивное. Нажал кнопку - система среагировала. Провел мышкой - среагировала. Вся информация, которая доступна клиенту - доступна и программе, программа все время находится в памяти.
Так вот, в веб-программировании это не так! .
В момент, когда пользователь видит перед собой страницу и начинает совершать какие-то действия с ней, PHP уже завершил работу ! И пользователь взаимодействует не с PHP скриптом, а со своей страницей HTML, которую он получил в браузер. Результатом работы скрипта на PHP в большинстве случаев является обычный текст. Текст HTML страницы. Которая отдается браузеру и показывается им, как обычный HTML. Вы сами можете в этом убедиться, написав в скрипте
;
А потом просмотрев в браузере исходный текст полученной страницы. Никаких тегов PHP там нет! Только
Привет, Вася!
Потому, что PHP исполняется на сервере!

Сервер и браузер общаются, посылая друг другу запросы по особому протоколу - HTTP . Соединение может инициировать только браузер. Он посылает серверу запрос - показать такой-то файл. Сервер клиенту файл посылает.
Только так и происходит. Клиент запросил - сервер отдал. И забыл сразу о клиенте. Отсюда становится понятным ответ на вопрос, можно ли точно узнать, сколько юзеров сечас на сайте. Нельзя. потому, что "на сайте" нету ни одного. Они соединяются, запрашивают страницу, и отсоединяются. Не имеют постоянного cоединения с сервером, как, например, игроки в Кваку. Узнать можно только примерно, записывая время каждого соединения и выбирая записи за определенный промежуток времени.

Пример общения браузера с сервером:
Пользователь нажимает на ссылку, браузер посылает запрос серверу и ждет ответа:
Браузер -> PHP
PHP выполняет скрипт, отдает результат в браузер и завершает работу:
PHP -> браузер
Браузер отображает страницу, "просматривая" её на предмет ссылок, которые надо запросить у сервера (теги , и так далее) и посылает соответствующие запросы. Их можно увидеть, просматривая обмен заголовками, о чем речь будет чуть ниже:
Браузер -> сервер, Браузер -> сервер, Браузер -> сервер...
Пользователь заполняет форму и нажимает на кнопку:
Браузер -> PHP
PHP обрабатывает форму, записывает данные в базу и посылает браузеру заголовок
Location:
PHP -> браузер
Браузер, получив этот заголовок, запрашивает указанную страницу
Браузер -> PHP
PHP выполняет ее... и так далее.

Просмотр обмена HTTP заголовками
Я очень рекомендую попрактиковаться с HTTP заголовками, посмотреть, как ими обмениваются сервер и клиент.
Для этого есть множество разных способов. Если у вас стоит популярный download manager FlashGet, то можно использовать его. Так же заголовки показывает популярная программа Proxomitron, можно скачать какие-нибудь специальные утилиты.
Для IE можно предложить плагин http://blunck.se/iehttpheaders/iehttpheaders.html
Для браузера Mozilla есть удобный плагин http://livehttpheaders.mozdev.org/
Так же, существует много других утилит, легко находимых в сети по запросу HTTP sniffer.
Обязательно воспользуйтесь любым способом посмотреть HTTP заголовки, которыми обменивается браузер с сервером. Это очень хорошая практика, а так же проверка - что шлет твой скрипт. Удобно при отладке установки кук или проблемах с сессиями.
Примерное представление о пришедших заголовках можно также получить, воспользовавшись функцией getallheaders() . Но следует учитывать, что работает она только если PHP собран, как модуль.

ОЧЕНЬ ВАЖНОЕ ЗАМЕЧАНИЕ
Из того факта, что PHP исполняется на сервере, и посылает результат своей работы браузеру, следует один простой, но очень важный вывод. Что PHP в принципе НЕ МОЖЕТ отобразить в браузере ничего такого, что невозможно было бы сделать средствами html.
ПРЕЖДЕ, чем что-то писать на PHP - попробуйте это сделать чистым HTML.
"Нажатие на Энтер" не переводит строку? А в html вы не пробовали таким образом строки переводить? Не получилось? Какая досада. Прочитайте, как в html сделать перевод строки и приходите снова.

PHP в результате своей работы формирует не картинку с текстами, как вы ее видите на экране монитора! PHP формирует HTML код! И этот код ЗНАЧИТЕЛЬНО отличается от того изображения, которое вы видите на экране. Если у вас что-то не получается, то надо всегда смотреть именно ИСХОДНЫЙ код страницы, а не то, как вам ее рисует браузер. В браузере Internet Explorer исходный код можно посмотреть, выбрав в меню Вид - Просмотр HTML-кода.
Если у вас не работает яваскрипт, сформированный PHP скриптом, или html показывает не то, что вы хотите, то исправить эту проблему очень просто.
1. Сначала пишете нужный яваскрипт или html руками. Если у вас с этим проблемы - обратитесь в соотвествующий форум - по яваскрипту или html. PHP тут не при чём.
2. Сравниваете с тем, что получено из PHP
3. Вносите исправления в PHP скрипт, чтобы текст, отдаваемый им, не отличался от написанного руками.

Браузер не умеет показывать файлы, в которые напихан одновременно и html картинки. Браузер умеет показывать только известные ему типы данных. В частности, это ИЛИ html ИЛИ картинка. Но не вместе. Если картинка - то ОДНА. Несколько картинок подряд браузер показывать не умеет. Браузер умеет показывать HTML, в котором прописаны ССЫЛКИ на несколько картинок.
Пожалуйста, прежде, чем изучать PHP - изучите хотя бы основы HTML! Прежде, чем что-то требовать от PHP - попробуйте сделать это на html.

19.01.17 7.7K

С помощью сессии PHP сервер идентифицирует вас и позволяет выполнять необходимые операции: изменение информации на различных веб-страницах, добавление новой информации и т.д. После завершения работы на сайте вы удаляете текущую сессию, нажав на кнопку «Выйти »:

Что такое сессия PHP?

Сессия PHP представляет собой способ хранения информации в переменных сессии, которые могут быть использованы для аутентификации на нескольких веб-страницах. В отличие от куков, информация сессии не хранится на компьютере пользователя. Вместо этого сессия создает файл на сервере во временном каталоге.

Эта информация, хранимая на протяжении сессии, доступна для всех веб-страниц ресурса. На сервере расположение временного файла определяется параметром session.save_path в конфигурационном файле php.ini .

При создании PHP-сессии выполняются следующие три действия:

  • Когда создается сессия, PHP генерирует уникальный идентификатор, который представляет собой случайную строку из 32 шестнадцатеричных чисел. Идентификатор времени жизни сессии PHP выглядит примерно так: 9c8foj87c3jj973actop1re472e8774 ;
  • Сервер отправляет на компьютер пользователя куки, называемые PHPSESSID , для хранения строки уникального идентификатора сессии;
  • Сервер генерирует в указанном временном каталоге файл, который содержит имя уникального идентификатора сессии с префиксом sess _g. sess_9c8foj87c3jj973actop1re472e8774 .

Эти установки помогают скрипту PHP извлекать из файла значения переменных сессии. На стороне клиента PHPSESSID содержит идентификатор сессии. Он подтверждает имя файла, который нужно искать в определенном каталоге на стороне сервера, из него переменные сессии могут быть извлечены и использованы для проверки.

Пользователь может завершить сеанс, нажав кнопку выхода из системы, которая вызывает функцию session_destroy() . Когда пользователь закрывает браузер, сессия PHP закрывается автоматически. Иначе сервер завершит сессию по истечении заданного периода времени.

Синтаксис сессий в PHP

При PHP авторизации через сессию она создается с помощью функции session_start() и удаляется с помощью функции session_destroy() . Глобальная переменная PHP , известная под именем $_SESSION , используется для установки значений переменных сессии. Сбросить все значения, установленные для переменных сессии, можно с помощью функции session_unset() .

Операции сессии

Мы рассмотрим следующие операции с использованием сессии PHP , а также их примеры.

  • Запуск сессии PHP и установка ее переменных сессии: новая сессия PHP запускается с помощью функции session_start() . После того, как сессия была создана, можно установить значения ее переменных сессии с помощью $_SESSION . Мы установили значения для переменных “userID ” — “php_user ” и “password ” — “tutorials ”:

PHP-сессии - создание

Результат : в результате запуска приведенного выше PHP-кода на сервере будет выведено следующее сообщение:

  • Получение значений переменных сессии PHP : Можно получить значения переменных, которые мы установили во время последней PHP сессии авторизации. Когда мы открываем PHP-сессию в начале каждой страницы (session_start () ), должен указываться код, приведенный ниже. Мы извлекаем и выводим эти значения с помощью глобальной переменной $_SESSION :

PHP-сессия - получение значений

Результат : когда мы запустим на сервере приведенный выше PHP-код , в результате мы получим следующее сообщение. Выводятся значения переменных сессии, которые мы установили ранее, после создания сессии PHP .

  • Обновление значений переменных сессии PHP : Во время сессии можно обновить значения ее переменных. Сначала нам нужно открыть PHP-сессию в начале каждой страницы (session_start () ). В приведенном ниже коде мы обновляем значения переменных “userID ” — “new_php_user ” и “password ” — “education ”.

Можно вывести массив переменных сессии и их значений с помощью функции print_r($ _SESSION) , как показано ниже:

PHP-сессия - изменение значений

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

Всем хорошего дня. Перед вами первая статья из серии PHP для начинающих разработчиков. Это будет необычная серия статей, тут не будет echo "Hello World" , тут будет hardcore из жизни PHP программистов с небольшой примесью “домашней работы” для закрепления материала.

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

Но для начала, чтобы понять зачем нам сессия, обратимся к истокам – к HTTP протоколу.

HTTP Protocol

HTTP протокол – это HyperText Transfer Protocol - «протокол передачи гипертекста» – т.е. по сути – текстовый протокол, и его понять не составит труда.

Изначально подразумевали, что по этому протоколу будет только HTML передаваться, отсель и название, а сейчас чего только не отправляют( _ㅅ_ )=^.^=

Чтобы не ходить вокруг да около, давайте я вам приведу пример общения по HTTP протоколу, вот запрос, каким его отправляет ваш браузер, когда вы запрашиваете страницу http://example.com:

GET / HTTP/1.1 Host: example.com Accept: text/html ...пустая строка...

А вот пример ответа:

HTTP/1.1 200 OK Content-Length: 1983 Content-Type: text/html; charset=utf-8 ... ...

Это очень упрощенные примеры, но и тут можно увидеть из чего состоят HTTP запрос и ответ:

  • стартовая строка – для запроса содержит метод и путь запрашиваемой страницы, для ответа – версию протокола и код ответа
  • заголовки – имеют формат ключ-значение разделенные двоеточием, каждый новый заголовок пишется с новой строки
  • тело сообщения – непосредственно HTML либо данные отделяют от заголовков двумя переносами строки, могут отсутствовать, как в приведенном запросе
  • Так, вроде с протоколом разобрались – он простой, ведёт свою историю аж с 1992-го года, так что идеальным его не назовешь, но какой есть – отправили запрос – получите ответ, и всё, сервер и клиент никоим образом более не связаны. Но подобный сценарий отнюдь не единственный возможный, у нас же может быть авторизация, сервер должен каким-то образом понимать, что вот этот запрос пришёл от определенного пользователя, т.е. клиент и сервер должны общаться в рамках некой сессии. И да, для этого придумали следующий механизм:

  • при авторизации пользователя, сервер генерирует и запоминает уникальный ключ – идентификатор сессии, и сообщает его браузеру
  • браузер сохраняет этот ключ, и при каждом последующем запросе, его отправляет
  • Для реализации этого механизма и были созданы (куки, печеньки) – простые текстовые файлы на вашем компьютере, по файлу для каждого домена (хотя некоторые браузеры более продвинутые, и используют для хранения SQLite базу данных), при этом браузер накладывает ограничение на количество записей и размер хранимых данных (для большинства браузеров это 4096 байт, см. RFC 2109 от 1997-го года)

    Т.е. если украсть cookie из вашего браузера, то можно будет зайти на вашу страничку в facebook от вашего имени? Не пугайтесь, так сделать нельзя, по крайней мере с facebook, и дальше я вас научу как можно защититься от данного вида атаки на ваших пользователей.

    Давайте теперь посмотрим как изменятся наши запрос-ответ, будь там авторизация:

    POST /login/ HTTP/1.1 Host: example.com Accept: text/html login=Username&password=Userpass

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

    HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Set-Cookie: KEY=VerySecretUniqueKey ... ...

    Ответ сервер будет содержать заголовок Set-Cookie: KEY=VerySecretUniqueKey , что заставит браузер сохранить эти данные в файлы cookie, и при следующем обращении к серверу – они будут отправлены и опознаны сервером:

    GET / HTTP/1.1 Host: example.com Accept: text/html Cookie: KEY=VerySecretUniqueKey ...пустая строка...

    Как можно заметить, заголовки отправляемые браузером (Request Headers) и сервером (Response Headers) отличаются, хотя есть и общие и для запросов и для ответов (General Headers)

    Сервер узнал нашего пользователя по присланным cookie, и дальше предоставит ему доступ к личной информации. Так, ну вроде с сессиями и HTTP разобрались, теперь можно вернутся к PHP и его особенностям.

    PHP и сессия

    Я надеюсь, у вас уже установлен PHP на компьютере, т.к. дальше я буду приводить примеры, и их надо будет запускать

    Язык PHP создавался под стать протоколу HTTP – т.е. основная его задача – это дать ответ на HTTP запрос и “умереть” освободив память и ресурсы. Следовательно, и механизм сессий работает в PHP не в автоматическом режиме, а в ручном, и нужно знать что вызвать, да в каком порядке.

    Перво-наперво необходимо “стартовать” сессию – для этого воспользуемся функцией session_start() , создайте файл session.start.php со следующим содержимым:

    Session_start();

    И теперь – обновляем страничку, и видим, что браузер отправляет эту куку на сервер, можете попробовать пару раз обновить страницу, результат будет идентичным:

    Итого, что мы имеем – теория совпала с практикой, и это просто отлично.

    Следующий шаг – сохраним в сессию произвольное значение, для этого в PHP используется супер-глобальная переменная $_SESSION , сохранять будем текущее время – для этого вызовем функцию date() :

    Session_start(); $_SESSION["time"] = date("H:i:s"); echo $_SESSION["time"];

    Обновляем страничку и видим время сервера, обновляем ещё раз – и время обновилось. Давайте теперь сделаем так, чтобы установленное время не изменялось при каждом обновлении страницы:

    Session_start(); if (!isset($_SESSION["time"])) { $_SESSION["time"] = date("H:i:s"); } echo $_SESSION["time"];

    Обновляем – время не меняется, то что нужно. Но при этом мы помним, PHP умирает, значит данную сессию он где-то хранит, и мы найдём это место…

    Всё тайное становится явным

    По умолчанию, PHP хранит сессию в файлах – за это отвечает директива session.save_handler , путь по которому сохраняются файлы ищите в директиве session.save_path , либо воспользуйтесь функцией session_save_path() для получения необходимого пути.

    В вашей конфигурации путь к файлам может быть не указан, тогда файлы сессии будут хранится во временных файлах вашей системы – вызовите функцию sys_get_temp_dir() и узнайте где это потаённое место.

    Так, идём по данному пути и находим ваш файл сессии (у меня это файл sess_dap83arr6r3b56e0q7t5i0qf91), откроем его в текстовом редакторе:

    Time|s:8:"16:19:51";

    Как видим – вот оно наше время, вот в каком хитром формате хранится наша сессия, но мы можем внести правки, поменять время, или можем просто вписать любую строку, почему бы и нет:

    Time|s:13:"\m/ (@.@) \m/";

    Для преобразования этой строки в массив нужно воспользоваться функцией session_decode() , для обратного преобразования – session_encode() – это зовется сериализацией, вот только в PHP для сессий – она своя – особенная, хотя можно использовать и стандартную PHP сериализацию – пропишите в конфигурационной директиве session.serialize_handler значение php_serialize и будет вам счастье, и $_SESSION можно будет использовать без ограничений – в качестве индекса теперь вы сможете использовать цифры и специальные символы | и! в имени (за все 10+ лет работы, ни разу не надо было:)

    Задание
    Напишите свою функцию, аналогичную по функционалу session_decode() , вот вам тестовый набор данных для сессии (для решения знаний регулярных выражений не требуется), текст для преобразования возьмите из файла вашей текущей сессии:

    $_SESSION["integer var"] = 123; $_SESSION["float var"] = 1.23; $_SESSION["octal var"] = 0x123; $_SESSION["string var"] = "Hello world"; $_SESSION["array var"] = ["one", "two", ]; $object = new stdClass(); $object->foo = "bar"; $object->arr = ["hello", "world"]; $_SESSION["object var"] = $object; $_SESSION["integer again"] = 42;

    Так, что мы ещё не пробовали? Правильно – украсть “печеньки”, давайте запустим другой браузер и добавим в него теже самые cookie. Я вам для этого простенький javascript написал, скопируйте его в консоль браузера и запустите, только не забудьте идентификатор сессии поменять на свой:

    Javascript:(function(){document.cookie="PHPSESSID=dap83arr6r3b56e0q7t5i0qf91;path=/;";window.location.reload();})()

    Вот теперь у вас оба браузера смотрят на одну и туже сессию. Я выше упоминал, что расскажу о способах защиты, рассмотрим самый простой способ – привяжем сессию к браузеру, точнее к тому, как браузер представляется серверу – будем запоминать User-Agent и проверять его каждый раз:

    Session_start(); if (!isset($_SESSION["time"])) { $_SESSION["ua"] = $_SERVER["HTTP_USER_AGENT"]; $_SESSION["time"] = date("H:i:s"); } if ($_SESSION["ua"] != $_SERVER["HTTP_USER_AGENT"]) { die("Wrong browser"); } echo $_SESSION["time"];

    Это подделать сложнее, но всё ещё возможно, добавьте сюда ещё сохранение и проверку $_SERVER["REMOTE_ADDR"] и $_SERVER["HTTP_X_FORWARDED_FOR"] , и это уже более-менее будет похоже на защиту от злоумышленников посягающих на наши “печеньки”.

    Ключевое слово в предыдущем абзаце похоже , в реальных проектах cookies уже давно «бегают» по HTTPS протоколу, таким образом никто их не сможет украсть без физического доступа к вашему компьютеру или смартфону

    Задание
    Добавьте в код проверку на IP пользователя, если проверка не прошла – удалите скомпрометированную сессию.

    По шагам

    А теперь поясню по шагам алгоритм, как работает сессия в PHP, на примере следующего кода (настройки по умолчанию):

    Session_start(); $_SESSION["id"] = 42;

  • после вызова session_start() PHP ищет в cookie идентификатор сессии по имени прописанном в session.name – это PHPSESSID
  • если нет идентификатора – то он создаётся (см. session_id()), и создаёт пустой файл сессии по пути session.save_path с именем sess_{session_id()} , в ответ сервера будет добавлены заголовки, для установки cookie {session_name()}={session_id()}
  • если идентификатор присутствует, то ищем файл сессии в папке session.save_path:
    • не находим – создаём пустой файл с именем sess_{$_COOKIE} (идентификатор может содержать лишь символы из диапазонов a-z , A-Z , 0-9 , запятую и знак минус)
    • находим, читаем файл и распаковываем данные (см. session_decode()) в супер-глобальную переменную $_SESSION
  • когда скрипт закончил свою работу, то все данные из $_SESSION запаковывают с использованием session_encode() в файл по пути session.save_path с именем sess_{session_id()}
  • Задание
    Задайте в вашем браузере произвольное значение куки с именем PHPSESSID , пусть это будет 1234567890 , обновите страницу, проверьте, что у вас создался новый файл sess_1234567890

    А есть ли жизнь без “печенек”?

    PHP может работать с сессией даже если cookie в браузере отключены, но тогда все URL на сайте будут содержать параметр с идентификатором вашей сессии, и да – это ещё настроить надо, но оно вам надо? Мне не приходилось это использовать, но если очень хочется – я просто скажу где копать:

    А если надо сессию в базе данных хранить?

    Для хранения сессии в БД потребуется изменить хранилище сессии и указать PHP как им пользоваться, для этой цели создан интерфейс SessionHandlerInterface и функция session_set_save_handler .

    Отдельно замечу, что не надо писать собственные обработчики сессий для redis и memcache – когда вы устанавливаете данные расширения, то вместе с ними идут и соответствующие обработчики, так что RTFM наше всё. Ну и да, обработчик нужно указывать до вызова session_start() ;)

    Задание
    Реализуйте SessionHandlerInterface для хранения сессии в MySQL, проверьте, работает ли он.
    Это задание со звёздочкой, для тех кто уже познакомился с базами данных.

    Когда умирает сессия?

    Интересный вопрос, можете задать его матёрым разработчикам – когда PHP удаляет файлы просроченных сессий? Ответ есть в официальном руководстве, но не в явном виде – так что запоминайте:

    Сборщик мусора (garbage collection) может запускаться при вызове функции session_start() , вероятность запуска зависит от двух директив session.gc_probability и session.gc_divisor , первая выступает в качестве делимого, вторая – делителя, и по умолчанию эти значения 1 и 100, т.е. вероятность того, что сборщик будет запущен и файлы сессий будут удалены – примерно 1%.

    Задание
    Измените значение директивы session.gc_divisor так, чтобы сборщик мусора запускался каждый раз, проверьте что это так и происходит.

    Самая тривиальная ошибка

    Ошибка у которой более полумиллиона результатов в выдаче Google:

    Cannot send session cookie – headers already sent by
    Cannot send session cache limiter – headers already sent

    Для получения таковой, создайте файл session.error.php со следующим содержимым:

    Echo str_pad(" ", ini_get("output_buffering")); session_start();

    Во второй строке странная “магия” – это фокус с буфером вывода, я ещё расскажу о нём в одной из следующих статей, пока считайте это лишь строкой длинной в 4096 символов, в данном случае – это всё пробелы

    Запустите, предварительно удалив cookie, и получите приведенные ошибки, хоть текст ошибок и разный, но суть одна – поезд ушёл – сервер уже отправил браузеру содержимое страницы, и отправлять заголовки уже поздно, это не сработает, и в куках не появилось заветного идентификатора сессии. Если вы стокнулись с данной ошибкой – ищите место, где выводится текст
    раньше времени, это может быть пробел до символов в одном из подключаемых файлов, и ладно если это пробел, может быть и какой-нить непечатный символ вроде BOM , так что будьте внимательны, и вас сия зараза не коснется (как-же, … гомерический смех).

    Задание
    Для проверки полученных знаний, я хочу, чтобы вы реализовали свой собственный механизм сессий и заставили приведенный код работать:

    Require_once "include/sess.php"; sess_start(); if (isset($_SESS["id"])) { echo $_SESS["id"]; } else { $_SESS["id"] = 42; }

    Для осуществления задуманного вам потребуется функция register_shutdown_function()

    В заключение

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

    P.S. Если узнали что-то новое из статьи – отблагодарите автора – зашарьте статью в социалках;)