Обработка собственных сеансов в PHP в большинстве случаев прекрасна. Существует по крайней мере две возможные причины, по которым вы захотите изменить способ обработки сеансов:
- При использовании нескольких серверов необходимо иметь общее хранилище сеансов для обоих серверов.
- Сеансы PHP по умолчанию используют файлы, поэтому максимальная возможная производительность ограничена дисковым вводом-выводом.
- Сеансы PHP по умолчанию блокируют параллельные хранилища сеансов. В этом рецепте мы увидим, как использовать эффективное хранение для сеансов Yii.
Создайте новое yii2-app-basic приложение с помощью диспетчера пакетов Composer, как описано в официальном руководстве по адресу http://www.yiiframework.com/doc-2.0/guide-start-installation.html. По русски http://yiiframework.domain-na.me/doc/guide/2.0/ru/start-installation и установить сервер Memcache и расширение MEMCACHE PHP.
Мы будем стресс-тестировать веб-сайт с помощью инструмента Apache ab. Он распространяется с двоичными файлами Apache, поэтому, если Вы используете Apache, вы найдете его в каталоге bin.
1 Выполните следующую команду, заменив ваш сайт фактическим именем хоста, который вы используете:
ab -n 1000 -c 5 http://yii-book.app/index.php?r=site/contact
Это будет посылать 1000 запросов, пять одновременно, и будет выводить статистику следующим образом:
This is ApacheBench, Version 2.3 <$Revision: 1528965 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Server Software: nginx
Server Hostname: yii-book.app
Server Port: 80
Document Path: /index.php?r=site/contact
Document Length: 14866 bytes
Concurrency Level: 5
Time taken for tests: 10.961 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 15442000 bytes
HTML transferred: 14866000 bytes
Requests per second: 91.24 [#/sec] (mean)
Time per request: 54.803 [ms] (mean)
Time per request: 10.961 [ms] (mean, across all concurrent requests)
Transfer rate: 1375.84 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 18 55 324.9 29 4702
Waiting: 15 41 255.1 24 4695
Total: 18 55 324.9 29 4702
Нас интересует показатель запросов в секунду. Это число означает, что веб-сайт может обрабатывать 91,24 запросов в секунду, если одновременно имеется пять запросов.
Замечание: Обратите внимание, что отладка не отключена, так как нас интересуют изменения скорости обработки сеанса.
2 Теперь добавьте следующее в /config/web.php раздел компоненты:
'session' => array(
'class' => 'yii\web\CacheSession',
'cache' => 'sessionCache',
),
'sessionCache' => array(
'class' => 'yii\caching\MemCache',
),
3 Запустите ab снова с теми же настройками. На этот раз, вы должны получить лучшие результаты. В моем случае это было 139.07 запросов в секунду. Это означает, что Memcache, как обработчик сеанса, выполнил 52% лучше, чем файловый обработчик сеанса по умолчанию.
Замечание: Не полагайтесь на точные результаты, приведенные здесь. Все зависит от версий программного обеспечения, настроек и используемого оборудования. Всегда выполняйте все тесты самостоятельно в среде, в которой планируется развертывание приложения.
4 Вы можете получить значительный прирост производительности, выбрав правильный серверной обработки сеанса. Yii поддерживает больше кэширования серверных частей из коробки, включая wincache, xcache и кэш данных Zend, который поставляется с сервером Zend. Кроме того, вы можете реализовать собственную серверную часть кэша для использования быстрого хранения noSQL, например Redis.
По умолчанию Yii использует собственные сеансы PHP; это означает, что файловая система используется в большинстве случаев. Файловая система не может эффективно работать с высоким параллелизмом. Memcache или другие платформы отлично работают в следующей ситуации:
'session' => array(
'class' => 'yii\web\CacheSession',
'cache' => 'sessionCache',
),
'sessionCache' => array(
'class' => 'yii\caching\MemCache',
),
В предыдущем разделе config мы указываем Yii использовать CacheSession в качестве обработчика сеанса. С помощью этого компонента мы можем делегировать обработку сеанса компоненту кэша, указанному в кэше. На этот раз мы используем MemCache. При использовании серверной части memcached следует учитывать тот факт, что при использовании этих решений пользователь приложения может потерять сеанс при достижении максимальной емкости кэша.
Замечание:Обратите внимание, что при использовании серверной части кэша для сеанса Вы не можете полагаться на сеанс как на временное хранилище данных, так как тогда не будет памяти для хранения большего количества данных в memcached. В таком случае, это будет просто удалить все данные или удалить некоторые из них. Если вы используете несколько серверов, Вы не можете использовать файловое хранилище. Не существует способа совместного использования данных сеанса между серверами. В случае memcached, это легко, потому что к нему можно легко получить доступ от стольких серверов, как вы хотите. Кроме того, для обмена данных можно использовать DbSession:
return [
// ...
'components' => [
'session' => [
'class' => 'yii\web\DbSession',
],
],
];
Теперь создайте новую таблицу в базе данных:
CREATE TABLE session (
id CHAR(40) NOT NULL PRIMARY KEY,
expire INTEGER,
data BLOB
)
Рекомендуется как можно скорее закрыть сессию. Если Вы не собираетесь хранить что-либо в сеансе во время текущего запроса, вы можете даже закрыть его в самом начале действия контроллера. Таким образом, даже при использовании файлов в качестве хранилища ваше приложение должно быть в порядке. Используйте следующую команду:
Yii:$app->session->close();
Дополнительные сведения о производительности и кэшировании см. по следующим URL-адресам: