Под сеансом понимается время, которое проходит от входа на веб-сайт до закрытия браузера, когда пользователь просматривает веб-сайт, то есть время, которое пользователь тратит на просмотр веб-сайта. Из приведенного выше определения мы видим, что сеанс на самом деле представляет собой определенную концепцию времени.
Вообще говоря, переменные (имеются в виду переменные на стороне сервера, то же самое ниже) на определенной странице веб-сайта не могут использоваться на следующей странице. С ними проще работать с сеансом. Переменные, зарегистрированные в сеансе, можно использовать как глобальные переменные. Таким образом, мы можем использовать сеанс для аутентификации личности пользователя, записи состояния программы и передачи параметров между страницами.
Как реализован сеанс в версии PHP3?
PHP3 сам по себе не реализует функцию сеанса. Для ее реализации мы можем использовать только другие методы, наиболее известным из которых является phplib. Самые основные функции phplib включают аутентификацию пользователей, управление сеансами, разрешения и абстракцию базы данных. Далее мы опишем, как использовать phplib для реализации сеанса.
1. Сначала установите phplib (среда — win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 для win32).
Сначала разархивируйте phplib. Скопируйте этот каталог в Apache. каталог установки. Например: Apache установлен в каталог d:Apache, затем скопируйте каталог «php» в d:Apache и скопируйте файлы и каталоги из каталога страниц каталога phplib (исключая сам каталог) в d: В Apachehtdocs.
Библиотеку классов phplib необходимо инициализировать в соответствии с системой, а также, возможно, потребуется изменить файл local.inc, который содержит некоторые основные параметры, которые можно изменить в соответствии с реальной ситуацией на вашем компьютере.
Измените программу в файле d:Apachephpprepend.php на следующую:
if (!isset($_PHPLIB) или !is_array($_PHPLIB)) {
$_PHPLIB["libdir"] = "d:/Apache/php/"; //Путь к каталогу php в phplib;
}
Измените файл d:Apachephplocal.inc:
class DB_Example расширяет DB_Sql {
var $Host = "localhost"; //Имя хоста базы данных MySQL var $Database = "test"; //Имя базы данных var $User = "root"; //Имя пользователя базы данных var $Password = "1234567"; // Пароль пользователя базы данных
}
Наконец, исходная таблица генерируется на основе файла create_database.mysql в подкаталоге Stuff каталога phplib.
Поскольку каждая страница, использующая phplib, сначала должна иметь возможность найти файлы библиотеки классов, необходимые для запуска phplib, мы можем установить переменную auto_prepend в php.ini для ее поддержки. phplib содержит файл prepend.php и указывает auto_prepend как «d:/». Apache/php/prepend.php" (с кавычками), каждая страница будет автоматически включать библиотеку классов phplib. Мы также можем добавить каталог, в котором находится библиотека классов phplib, в переменную include, чтобы эти файлы можно было найти. 2. Вызовите функцию page_open()
На каждой странице, использующей phplib, вы должны сначала вызвать функцию page_open для инициализации, например:
<?php.
page_open(array("sess" => "Test_Session");
?>
Переменные массива (sess) используются для инициализации некоторых объектов сохранения состояния. Здесь следует отметить: необходимо использовать встроенные имена phplib (sess). Эти встроенные имена определены в local.inc.
Поскольку phplib использует файлы cookie для сохранения информации о состоянии, функцию page_open() необходимо вызывать до того, как содержимое страницы будет выведено в браузер. PHP-скрипт должен заканчиваться вызовом page_close(), который запишет соответствующие данные о состоянии обратно в базу данных, иначе переменные будут потеряны.
3. Специальное использование.
После регистрации переменной вы можете использовать ее на последующих страницах до завершения сеанса. Метод:
<?php $sess->register( "varname"); ?>
Обратите внимание, что varname здесь – это не значение переменной, а имя переменной. Вы можете сначала указать имя переменной, а затем присвоить ей значение. Вы можете изменить значение переменной на определенной странице, и измененное значение будет получено при доступе к переменной на последующих страницах. Типы переменных разнообразны и могут быть строкой, числом или массивом. Например:
первая страница:
<?php
page_open(array("sess" => "Test _Session");
$sess->register( "welcome"); //Зарегистрируем переменную $welcome, обратите внимание, что добавлять $ не нужно.
$welcome="Привет, мир PHP!";
…
страница_закрыть();
?>
Вторая страница:
<?php
page_open();//Начать сеанс
echo $welcome;//Отображение $welcome, определенного на первой странице
page_close();//сохраняем информацию о статусе
?>
После регистрации переменной, когда страница наконец вызывает функцию page_close(), каждая переменная сеанса будет записана обратно в базу данных. Если вы забудете вызвать функцию page_close(), переменные не будут записаны обратно в базу данных, что будет иметь непредсказуемые последствия. Когда переменная была использована и больше не нужна, для ее удаления можно вызвать следующую функцию:
<?php
page_open(array("sess" => "Test _Session");
…
$sess->unregister("имя_переменной");
…
страница_закрыть();
?>
Как реализовать сеанс в версии PHP4?
Сеанс PHP4 также использует файлы cookie для сохранения идентификаторов сеансов и использует файловую систему для сохранения переменных (по умолчанию). Поэтому переменные сеанса не могут сохранять объекты. Конечно, сеанс также можно сохранить в базе данных.
В php4 существует множество функций, связанных с сеансом (подробности см. в статье «Конфигурация php.ini»). Обычно нам нужно вызвать только три функции: session_start(), session_register(), session_is_registered().
Вызовите функцию session_start() в начале каждой страницы, требующей сеанса, например:
<?session_start()?>
<html><body>
<?
$welcome="Привет, мир!";
session_register("welcome");//Зарегистрируйте переменную $welcome, обратите внимание, что символ $ отсутствует if(session_is_registered("welcome"))//Проверьте, зарегистрирована ли переменная $welcome echo "Переменная приветствия зарегистрирована!";
еще
echo "Переменная приветствия еще не зарегистрирована!";
?>
</body></html>
Чтобы настроить обработку сеанса в php4,
нам нужно расширить 6 функций:
·sess_open($sess_path, $session_name);
Эта функция вызывается обработчиком сеанса для инициализации.
Параметр $session_path соответствует параметру session.save_path в файле php.ini. Параметр $session_name соответствует параметру session.name в php.ini.
·sess_close();
Эта функция вызывается, когда страница завершает выполнение и необходимо закрыть обработчик сеанса
·sess_read($key);
Эта функция извлекает и возвращает идентификатор, когда обработчик сеанса считывает указанное значение ключа сеанса ($key); ). Данные сеанса $key (Примечание. Сериализация — это технология, которая сохраняет переменные или объекты в файле в конце программы или при необходимости, а затем переносит их в память, когда программа запускается или понадобится в следующий раз. Это). отличается от метода только сохранения данных )
·sess_write($key, $val);
Эта функция вызывается, когда обработчику сеанса необходимо сохранить данные, что часто происходит в конце программы. Он отвечает за сохранение данных в месте, откуда их можно будет получить в следующий раз с помощью функции sess_read($key).
·sess_destroy($key);
Эта функция должна уничтожить сеанс. Он отвечает за удаление сеанса и очистку среды.
·sess_gc($maxlifetime);
Эта функция отвечает за очистку фрагментов. В этом случае он отвечает за удаление устаревших данных сеанса. Обработчики сеансов время от времени вызывают их.
Пользовательская программа может использовать базу данных mysql или файл DBM для сохранения данных сеанса, в зависимости от конкретной ситуации. Если вы используете MySQL для поддержки, вам необходимо выполнить следующие шаги:
Сначала создайте базу данных сеансов в mysql и создайте таблицу сеансов:
mysql> CREATE DATABASE session;
mysql>GRANT выберите, вставьте, обновите, удалите сеансы ON.* TO phpsession@localhost
-> ИДЕНТИФИЦИРОВАН ПО «phpsession»;
mysql> Сеансы CREATE TABLE (
-> sesskey char(32) не равен нулю,
-> срок действия int(11) без знака, не нуль,
-> текст значения не равен нулю,
-> ПЕРВИЧНЫЙ КЛЮЧ (sesskey)
-> );
Затем измените переменные $SESS_DB* в файле session_mysql.php, чтобы они соответствовали настройкам базы данных на вашем компьютере:
<?
$SESS_DBHOST = "localhost"; Имя хоста базы данных*/;
$SESS_DBNAME = "сеансы" * имя базы данных*/;
$SESS_DBUSER = "phpsession"; Имя пользователя базы данных*/;
$SESS_DBPASS = "phpsession" /* Пароль базы данных*/;
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//Пользовательская функция
session_set_save_handler( "sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
Настройте интерфейс при использовании файлов dbm:
<?
$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//Пользовательская функция
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
Индивидуальный тестовый код сеанса:
<?php
…
if ($handler == "dbm") include("session_dbm.php");//Какой интерфейс использовать
elseif ($handler == "mysql") include("session_mysql.php");
иначе…
session_start();
session_register("счет");
…
?>
Как использовать сеанс при аутентификации?
Сессию можно использовать для аутентификации пользователя:
проверьте, является ли пользователь законным:
<?
сеанс_start();
……//Процесс проверки session_register("reguser");
?>
Проверьте, вошел ли пользователь на другую страницу
<?
сеанс_start();
if(isset($reguser)&&$reguser!=""){//Если вы вошли в систему, echo "Уважаемый пользователь, добро пожаловать";
}else{//Если вы не вошли в систему, echo "Сначала зарегистрируйтесь!";
}
?>
Пользователь выходит из системы:
<?
сеанс_разрушить();
…
?>
Как реализовать несколько сеансов, работающих одновременно?
Вопрос: Когда я писал систему закупок, продаж и инвентаризации для своего подразделения, я обнаружил, что необходимо разрешить нескольким пользователям одновременно входить в PHP-приложение. Первоначально разработанный статический уникальный идентификатор сеанса привел к путанице в данных. Таким образом, динамическое создание уникального идентификатора сеанса становится главным приоритетом.
Решение простое: я использовал имя php-файла + метку времени в качестве уникального идентификатора сеанса, чтобы каждый сеанс в моей программе находился на своем месте и больше не было путаницы.
Я опубликую свой исходный код ниже, чтобы друзья, у которых возникла такая же проблема, могли найти решение.
//Запускаем сеанс PHP, чтобы сохранить переменные.
если (пустой($mysessionname)) {
$микро = микровремя();
$micro = str_replace(" ","",$micro // удаляем пробелы;
$micro = str_replace(".","",$micro // удаляем точки;
$mysessionname = "po_maint" $micro;
}
имя_сеанса ($mysessionname);
session_start();
Примечания к программе:
Используйте mysessionname для передачи переменных для уникального имени сеанса между страницами. Если вы также используете это имя, вам необходимо внести небольшие изменения в приведенную выше программу. Mysessionname не может быть именем внутренней переменной сеанса, поскольку оно уже существует до начала сеанса. Mysessionname не может быть сохранен в режиме cookie, поскольку несколько сеансов обязательно перезапишут исходный файл cookie. Вы можете сохранить его, используя скрытые поля формы. Тогда не будет проблем.