Настройка сессий на веб-сервере
Выполняется путем настройки файла php.ini. Данный способ удобен, если мы являемся администратором веб-сервера, а также если есть гарантия, что общая настройка сессий не повлияет на работоспособность всех веб-приложений, работающих на данном сервере.
Открываем на редактирование php.ini. Его расположение зависит от сборки Linux. Точный путь можно посмотреть командой:
php -i | grep php.ini
Теперь открываем сам файл:
vi /etc/php.ini
* в моем случае каманда php -i | grep php.ini вернула данный путь.
В некоторых системах, например, Ubuntu или Debian для каждой среды обработки кода создается свой php.ini файл, а также для каждой версии PHP. Например, по пути /etc/php/7.4/fpm/php.ini находится файл для php-fpm для PHP версии 7.4. Нам необходимо учитывать данный факт, чтобы настроить нужный файл.
И редактируем следующие параметры:
session.gc_maxlifetime = 86400
session.cookie_lifetime = 0
* где параметр gc_maxlifetime указывает на временя в секундах, после прошествии которого данные могут быть удалены; cookie_lifetime — время жизни файлов cookies; 86400 — 24 часа в секундах.
* если параметру gc_maxlifetime задать значение 0, действие сессий будет бесконечным. Это, как правило, не стоит делать — приведет к падению производительности и безопасности сервера.
После настройки параметров, необходимо перезагрузить сервер, являющийся интерпретатором PHP.
Если это apache:
systemctl restart apache2 || systemctl restart httpd
* в версиях Linux без systemd используем команду service apache2 restart или service httpd restart.
Если используем FastCGI (PHP-FPM).
а) для CentOS:
systemctl restart php-fpm
б) для Ubuntu или Debian:
systemctl restart php7.4-fpm
* где 7.4 — версия используемого PHP.
Сессии в PHP
В
разнообразных конференциях, посвященных программированию меня в первую очередь
всегда интересуют такие разделы, как «Web-программирование» и
«Скрипты». По большей части, вопросы о PHP в таких форумах довольно
простые, требующие лишь общего понимания PHP, тем не менее, самый часто
задаваемый вопрос по моим наблюдениям, это: «Что такое сессии в PHP и с
чем/как их можно кушать?». Хотелось бы разъяснить этот вопрос раз и
навсегда.
С
самого начала PHP все приняли на ура, но как только на этом языке стали
создавать достаточно крупные проекты, разработчики столкнулись с новой
проблемой — в PHP отсутствовало понятие глобальных переменных! То есть,
выполнялся некий скрипт, посылал сгенерированную страницу клиенту, и все
ресурсы, используемые этим скриптом уничтожались. Попробую проиллюстрировать:
предположим есть две страницы одного сайта, index.php и dothings.php. Исходники
к этим страницам выглядят так:
—
index.php —
— dothings.php —
Если
выполнить эти два скрипта, то на первой странице мы увидим надпись «Меня
задали на index.php», а вторая страница будет пустой.
Разработчики
web-сайтов, недолго думая, стали использовать cookie для хранения глобальных
переменных на стороне клиента. Процесс выглядел примерно так: пользователь
приходит на главную страницу сайта, делает какие-то действия, и вся информация,
связанная с этим пользователем, которая может потребоваться на других страницах
сайта, будет храниться у него в браузере в виде cookie. Этот метод меет
довольно серьезные минусы, из-за которых от PHP в своё время отвернулось немало
разработчиков. Например, нам нужно авторизовать пользователя, чтобы разрешить
ему доступ к закрытым (или принадлежащим только ему) разделам сайта. Придёться
пользователю cookie, который будет служит его последующим
идентификатором на сайте. Такой подход становится очень громоздким и не удобным,
как только сайт начинает собирать всё больше и больше сведений о поведении
пользователя, ведь всю информацию, посылаемую пользователю, желательно
кодировать, чтобы её нельзя было подделать. Ещё совсем недавно подделкой cookie
можно было не один чат, а порой и пробраться в чужую почту. К
тому же есть ещё на свете странные люди, у которых браузер cookie не
поддерживает.
При
использовании сессий вся информация хранится не на стороне клиента, а на
стороне сервера, и потому лучше защищена от манипуляций злоумышленников. Да и
работать с сессиями куда проще и удобнее, так как все данные автоматически
проходят через алгоритмы криптографии модуля PHP. В броузере клиента, лишь
хранится уникальный идентификатор номера сессии, либо в форме cookie, либо в
виде переменной в адресной строке броузера, какой из двух способов использовать
для передачи идентификатора сессии между страницами интерпретатор PHPвыбирает
сам. Это на 100 безопасно, так как идентификатор сессии уникален, и подделать
его практически невозможно (об этом чуть далее, в разделе о безопасности
сессий).
Я
не буду вдаваться в технологические вопросы устройства механизма работы сессий,
а только опишу, как правильно работать с сессиями в PHP.
Creating a new session
To create a new session, you call the function:
When the runs at the first time, PHP generates a unique session id and passes it to the web browser in the form of a cookie named .
If a session already exists, PHP checks the cookie sent by the browser, the function will resume the existing session instead of creating a new one.
Since PHP sends the cookie in the header of the HTTP response, you need to call the function before any statement that outputs the content to the web browser.
Otherwise, you will get a warning message saying that the header cannot be modified because it is already sent. This is a well-know error message in PHP.
Deleting the session data
Whenever you close the web browser, PHP automatically deletes the session. Sometimes, you want to explicitly delete a session, e.g., when you click the logout link. In this case, you can use the function:
This deletes all data associated with the current session. However, it does not unset data in the array and cookie.
To completely destroy the session data, you need to unset the variable in array and remove the cookie like this:
Notice that we used the function to get the cookie name instead of using the . This is because PHP allows you to work with multiple sessions with different names on the same script.
Как автоматически продлевать сессии
Если сессия выдается на определенный период и заканчивается в определенное время, это может привести к прерыванию активного сеанса пользователя. Гораздо удобнее, если время действия сессии будет автоматически продлеваться, если посетитель обновляет страницу. Для этого существует параметр cookie_lifetime, который во всех примерах выше мы задавали в значении 0.
Если мы зададим значение cookie_lifetime 86400, то через 24 часа сессия прервется. Это не всегда удобно.
Если есть необходимость в контроле и прерывании сессии, можно воспользоваться php-функцией session_destroy().
Настройка через файл .htaccess
Данный файл позволяет веб-мастеру управлять некоторыми настройками веб-сервера. Для его редактирования нужен доступ к файлам сайта. Способ не сработает, если в качестве обработчика PHP используется не Apache, а, например, NGINX + PHP-FPM. Хотя, тут тоже есть способ (о нем будет ниже).
В файл .htaccess вносим следующее:
php_value session.gc_maxlifetime 86400
php_value session.cookie_lifetime 0
* как можно заметить, параметры те же, что при настройки через php.ini.
Как говорилось выше, метод не сработает, если не используется Apache. Однако настройку можно выполнить на сервере (опять же, у нас должен быть соответствующий доступ).
Открываем файл настройки веб-сервера, например, в php-fpm:
vi /etc/php-fpm.d/www.conf
и редактируем/добавляем:
php_value = 86400
php_value = 0
После перезапускаем сервис:
systemctl restart php-fpm || service php-fpm restart
Операции сессии
Мы рассмотрим следующие операции с использованием сессии PHP, а также их примеры.
Запуск сессии PHP и установка ее переменных сессии: новая сессия PHP запускается с помощью функции session_start(). После того, как сессия была создана, можно установить значения ее переменных сессии с помощью $_SESSION. Мы установили значения для переменных “userID” — “php_user” и “password” — “tutorials”:
<?php // Открытие сессии PHP session_start(); ?> <!DOCTYPE html> <html> <head> <title>PHP-сессии - создание</title> </head> <body> <?php // Устанавливаем переменные сессии $_SESSION = "php_user"; $_SESSION = "tutorials"; echo "<br>Сессия PHP начата и переменные сессии заданы!"; ?> </body> </html>
Результат: в результате запуска приведенного выше PHP-кода на сервере будет выведено следующее сообщение:
<?php // Открытие сессии PHP session_start(); ?> <!DOCTYPE html> <html> <head> <title>PHP-сессия - получение значений</title> </head> <body> <?php // Вводим переменные сессии PHP, которые мы установили перед этим echo " ID ползователя - " . $_SESSION . ".<br><br>"; echo "Пароль - " . $_SESSION . "."; ?> </body> </html>
Результат: когда мы запустим на сервере приведенный выше PHP-код, в результате мы получим следующее сообщение. Выводятся значения переменных сессии, которые мы установили ранее, после создания сессии PHP.
Можно вывести массив переменных сессии и их значений с помощью функции print_r($ _SESSION), как показано ниже:
<?php // Открытие сессии PHP session_start(); ?> <!DOCTYPE html> <html> <head> <title>PHP-сессия - изменение значений</title> </head> <body> <?php // Устанавливаем переменные сессии PHP $_SESSION = "new_php_user"; $_SESSION = "education"; echo "Переменные сессии PHP успешно изменены!<br><br>"; print_r($_SESSION); ?> </body> </html>
Результат: когда мы запустим на сервере приведенный выше PHP код, мы получим следующее сообщение. В нем будет приведен массив переменных сессии с их новыми значениями:
Удаление сессии PHP и сброс всех значений переменных сессии: Можно сбросить сессию PHP с помощью функции session_unset() и удалить текущую сессию с помощью функции session_destroy():
<?php // Открытие сессии PHP session_start(); ?> <!DOCTYPE html> <html> <head> <title>PHP-сессия - удаление</title> </head> <body> <?php // удаляем все переменные сессии PHP session_unset(); print_r($_SESSION); // удаляем сессию PHP session_destroy(); echo "<br><br>Сессия PHP и все переменные сессии были успешно удалены!<br><br>"; ?> </body> </html>
Результат: когда мы запустим на веб-сервере приведенный выше PHP-код, в результате он выведет следующее сообщение:
Использование MySQL для хранения данных сессий
Для высоконагруженных проектов использование файлов для хранения файлов сессий становится недопустимым.
Сейчас мы рассмотрим использвоание БД MySql для хранения данных сессий.
- все настройки сессий производятся до старта сессии, поэтому необходимо отменить автостарт сессий:
- стандартно PHP хранит сессии в файлах, чтобы установить свои обработчики сессий определим: у ‘session.save_handler’ может быть три значения:
- files — значение по умолчанию, PHP использует стандартные функции обработки сессий, сессии храняться в файлах, необходимо определить ini_set(‘session.save_path’, путь); место для хранения файлов сессий.;
- mm — PHP использует стандартные функции обработки сессий, сессии храняться в памяти;
- user — позволяет переопределять стандартные функции обработки сессий, и соответственно в этих функциях указывать, где мы будем хранить сессии и как мы будем их обрабатывать.
- теперь определим функции обработки сессий: рассмотрим каждую:
- sess_open — открывает сессию. Функция создает уникальное ID сессии. Требует для своей работы два параметра ‘session.save_path’ и ‘session.name’. Т.к. мы храним сессии в базе, то ‘session.save_path’ нам не нужен, а вот ‘session.name’ можно определить вместо стандартного — ‘PHPSESSID’. Итак дописываем в конфигурацию:
- sess_close — закрывает сессию (не разрушая сессионные переменные).
- sess_read — читает данные из временного хранилища, в нашем случае из базы. Требует ID сессии, что из таблицы сессии надо прочитать и записать в сессию из таблицы сессий.
- sess_write — пишет данные во временное хранилище. Требует ID сессии, и пишет все из сессии в базу.
- sess_destroy — разрушает сессию. Требует ID сессии. Для удаления информации существует следующая функция.
- sess_gc — это просто сборщик мусора. Требует срок хранения сессий во временном хранилище в секундах определенного в параметре ‘session.gc_maxlifetime’ (по умолчанию 30 минут). Определяем его, и определим время жизни сессионной куки:
‘sess_gc’ не всегда вызывается при инициализации сессии, есть еще одна настройка которая управляет этим параметром — ‘session.gc_probability’. Этот параметр определяет вероятность запуска ‘sess_gc’ в процентах, соответственно валидные значения 1-100. Значение по умолчанию 1%. Т.е. это означает, что с вероятностью в 1%, при открытии новой странице сайта, будет происходить очистка сессионной таблицы, по моему опыту оптимально значение 5-10. Добавляем к конфигурации:
session.php — Хранение данных сессии в MySQL таблице и функции работы с сессиями на PHP.
Используется глобальный массив $user[] с полями из таблиц БД session, user. Подразумевается что соединение с MySQL уже установлено и определено в глобальной переменной $db. Текущая информация сохрняется в глобальной переменной $session.
Introduction to PHP sessions
The HTTP protocol is stateless. For example, when you visit the product page , the web server responds with the page:
Suppose, you click the add to cart button on the page and navigate to the page, the web server won’t know that you have added the product to the cart.
To persist the information across the pages, the web server uses sessions. In this example, when you click the add to cart button, the web server will store the product on the server.
When you view the page, the web server gets the products from the session and displays them on the page:
How it works.
- First, the web browser requests for the page.
- Second, the web server responds with the page’s content.
- Third, you click the Add To Cart button on the page. The page will send an HTTP request (either POST or GET) to the web server. The web server validates the product and generates a session id. It also creates a new text file on the server to store the information related to the selected product.
- Fourth, the web server responds to the web browser with the cookie in the response header. If the web browser allows cookies, it will save the cookie, which stores the session id passed by the web server.
- Fifth, in the subsequent request, for example, when you view the page, the web browser passes the back to the web server. When the web server sees the cookie, it will resume the session with the session id stored in the cookie.
- Finally, the web server returns the cart page with the products that you selected.
Sessions allow you to store data on the web server associated with a session id. Once you create a session, PHP sends a cookie that contains the session id to the web browser. In the subsequent requests, the web browser sends the session id cookie back to the web server so that PHP can retrieve the data based on the session id.
PHP Что такое сессии?
При работе с приложением Вы открываете его, вносите некоторые изменения и
затем вы закрываете его. Это похоже на сеанс. Компьютер знает, кто ты.
Он знает, когда вы запустите приложение и когда вы закончите. Но в интернете
есть одна проблема: веб сервер не знает, кто Вы и что делаете,
потому что HTTP адрес не поддерживает состояние.
Переменные решают эту проблему, сохраняя информацию о пользователе
для использования на нескольких страницах (например: имя пользователя, любимый цвет и т.д.).
По умолчанию сессия длится до закрытия браузера пользователем.
Таким образом, переменные содержат информацию
об одном пользователе и доступны для всех страниц в одном приложении.
Совет: Если вам нужно постоянного хранения, Вы можете хранить данные в
базе данных.
What is a PHP Session?
When you work with an application, you open it, do some changes, and
then you close it. This is much like a Session. The computer knows who you are.
It knows when you start the application and when you end. But on the internet
there is one problem: the web server does not know who you are or what you do,
because the HTTP address doesn’t maintain state.
Session variables solve this problem by storing user information
to be used across multiple pages (e.g. username, favorite color, etc). By
default, session variables last until the user closes the browser.
So; Session variables hold information about one single user, and are available to all pages in one application.
Tip: If you need a permanent storage, you may want to store the data in a
database.
Get PHP Session Variable Values
Next, we create another page called «demo_session2.php». From this page, we
will access the session information we set on the first page («demo_session1.php»).
Notice that session variables are not passed individually to each new page,
instead they are retrieved from the session we open at the beginning of each
page ().
Also notice that all session variable values are stored in the global $_SESSION variable:
Example
<?phpsession_start();?><!DOCTYPE html><html>
<body><?php// Echo session variables that were set on previous pageecho «Favorite color is » . $_SESSION . «.<br>»;echo «Favorite animal is » . $_SESSION . «.»;?>
</body></html>
Another way to show all the session variable values for a user session is to run the
following code:
Example
<?phpsession_start();?><!DOCTYPE html><html><body><?php
print_r($_SESSION);?></body></html>
How does it work? How does it know it’s me?Most sessions set a user-key on
the user’s computer that
looks something like this: 765487cf34ert8dede5a562e4f3a7e12. Then, when a
session is opened on another page, it scans the computer for a user-key. If
there is a match, it accesses that session, if not, it starts a new session.
Заключение
В этой статье мы рассказали о различных функциях для работы с сессиями PHP, их синтаксисе. В отличие от куков, информация сессий хранится на стороне сервера. Благодаря этому сессии PHP более надежны.
Пожалуйста, оставьте ваши мнения по текущей теме статьи. За комментарии, лайки, отклики, дизлайки, подписки низкий вам поклон!
Пожалуйста, опубликуйте свои комментарии по текущей теме материала. Мы очень благодарим вас за ваши комментарии, подписки, дизлайки, отклики, лайки!
Пожалуйста, оставляйте ваши комментарии по текущей теме материала. Мы очень благодарим вас за ваши комментарии, отклики, лайки, подписки, дизлайки!
Вадим Дворниковавтор-переводчик статьи «Learn Working with Sessions in PHP»