В
різноманітних конференціях, присвячених програмуванню мене в першу чергу
завжди цікавлять такі розділи, як "Web-програмування" та
"Скрипти". Здебільшого, питання про PHP в таких форумах досить
прості, які вимагають лише загального розуміння PHP, тим не менше, найбільш часто
задається питання за моїми спостереженнями, це: "Що таке сесії в PHP і з
чим/як їх можна їсти? ". Хотілося б роз'яснити це питання раз і
назавжди. p>
З
самого початку PHP всі прийняли на ура, але як тільки на цій мові стали
створювати достатньо великі проекти, розробники зіткнулися з новою
проблемою - в PHP було відсутнє поняття глобальних змінних! Тобто,
виконувався якийсь скрипт, посилав згенеровану сторінку клієнту, і все
ресурси, що використовуються цим скриптом знищувалися. Спробую проілюструвати:
припустимо є дві сторінки одного сайту, index.php і dothings.php. Исходники
до цих сторінках виглядають так: p>
--
index.php - p>
php p>
$ a
= "Мене поставили на index.php"; p>
?> p>
p>
php p>
echo $ a; p>
?> p>
body> html> p>
- dothings.php - p>
p>
php p>
echo $ a; p>
?> p>
body> html> p>
Якщо
виконати ці два скрипта, то на першій сторінці ми побачимо напис "Мене
поставили на index.php ", а друга сторінка буде пустою. p>
Розробники
web-сайтів, не довго думаючи, стали використовувати cookie для зберігання глобальних
змінних на стороні клієнта. Процес виглядав приблизно так: користувач
приходить на головну сторінку сайту, робить якісь дії, і вся інформація,
пов'язана з цим користувачем, що може знадобитися на інших сторінках
сайту, буде зберігатися у нього в браузері у вигляді cookie. Цей метод розуміється
досить серйозні мінуси, через які від PHP свого часу відвернулася чимало
розробників. Наприклад, нам потрібно схвалити користувача, щоб дозволити
йому доступ до закритих (чи належить тільки йому) розділів сайту. Доведеться
<кидати> користувачеві cookie, який служить його подальшим
ідентифікатором на сайті. Такий підхід стає дуже громіздким і не зручним,
як тільки сайт починає збирати все більше і більше відомостей про поведінку
користувача, адже всю інформацію, що їх посилають користувачеві, бажано
кодувати, щоб її не можна було підробити. Ще зовсім недавно підробкою cookie
можна було <повалити> не один чат, а часом і пробратися в чужу пошту. До
того ж є ще на світі дивні люди, у яких браузер cookie НЕ
підтримує. p>
При
використанні сесій вся інформація зберігається не на стороні клієнта, а на
стороні сервера, і тому краще захищена від маніпуляцій зловмисників. Та й
працювати з сесіями куди простіше і зручніше, так як всі дані автоматично
проходять через алгоритми криптографії модуля PHP. У броузері клієнта, лише
зберігається унікальний ідентифікатор номера сесії, або у формі cookie, або в
вигляді змінної в адресному рядку браузера, який із двох способів використовувати
для передачі ідентифікатора сесії між сторінками інтерпретатор PHPвибірает
сам. Це на 100 безпечно, так як ідентифікатор сесії унікальний, і підробити
його практично неможливо (про це трохи далі, в розділі про безпеку
сесій). p>
Я
не буду вдаватися в технологічні питання пристрої механізму роботи сесій,
а тільки опишу, як правильно працювати з сесіями в PHP. p>
Як працювати з сесіями? h2>
Якщо
ви будете тестувати приклади зі статті (або ваші скрипти) на якому-небудь
комерційному хостингу, проблем з роботою з сесіями бути не повинно. Якщо ж ви
самі налаштовували ваш сервер (будь то реальний сервер, або емулятор), можуть
з'являтися помилки приблизно такого змісту: p>
"Warning: open (/ var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0,
O_RDWR) failed: No such file or directory (2 )". p>
Це
означає лише, що у вас неправильно налаштований PHP. Вирішити цю проблему
можна, прописавши правильний шлях (на існуючу директорію), щоб зберегти сесій
у файлі php.ini і перезапустити сервер. p>
Будь-який
скрипт, який буде використовувати змінні (дані) з сесій, повинен
містити наступну рядок: p>
session_start (); p>
Ця
команда говорить серверу, що дана сторінка має потребу у всіх змінних,
які пов'язані з даним користувачем (браузером). Сервер бере ці перемнние
(з файлу, або з БД) і робить їх доступними. Дуже важливо відкрити сесію до
того, як будь-які дані будуть надсилатися користувачеві; на практиці це
значить, що функцію session_start () бажано викликати на самому початку
сторінки, наприклад так: p>
php p>
session_start (); p>
?> p>
p>
p>
head> p>
... p>
Після
початку сесії можна задавати глобальні змінні. Це елементарно: викликаємо
функцію session_register ( 'var_name'); та змінна $ var_name стає
доступною на всіх сторінках, що використовують сесію. Для прикладу покорписав
програмку, наведену на початку статті: p>
--
index.php - p>
php p>
//
відкриваємо сесію p>
session_start (); p>
//
задаємо значення змінної p>
$ a
= "Мене поставили на index.php"; p>
//
реєструємо змінну з відкритою сесією p>
//
важливо: назви змінних передаються функції session_register () p>