PHP 7.1 и хранение сессий в Redis

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

Блокировка и хранение сессий в Redis

PHP по умолчанию создает для сессии файл, и процесс эксклюзивно его блокирует. В случае долгого выполнения остальные процессы, пытающиеся открыть сессию, выстраиваются в очередь. Фактически это означает невозможность параллельного выполнения запросов в рамках одной сессии. В современной модели разработки приложений с множеством AJAX-запросов это может приводить к значительному замедлению работы web-приложения. В случае длительного выполнения отдельного скрипта ситуация усугубляется еще и тем, что последующие запросы, находящиеся в очереди, способны быстро забить доступный пул PHP процессов и привести к появлению 5XX ошибок.

Понимание проблемы

В качестве примера, для воспроизведения проблемы создадим два файла со следующим содержимым:

# file start_session.php
<?php
session_start();
sleep(30);
?>
# file test.php
<?php
session_start();
echo "Ok";
?>

Запросим через браузер скрипт start_session.php , а во второй вкладке запросим test.php. Вторая вкладка будут дожидаться освобождения сессии (30 секунд), и это займет много времени. Примерно то же самое случается, когда AJAX запускает в сессии веб-клиента тяжелую задачу, и остальные AJAX и другие элементы интерфейса зависают в ожидании, либо когда открывается несколько вкладок под одной авторизацией.

Решение

Наши пользователи с появлением сервиса Redis и настройки параметров PHP для домена могли сами настраивать хранение сессий в Redis, что само по себе исключает блокировки. Правда, это было связано с некоторыми сложностями - в случае отключения Redis из панели управления сайты переставали работать, а также данную настройку приходилось делать для каждого домена. Все эти недостатки мы исправили, теперь включить Redis можно сразу для всех сайтов в разделах "Сайты" и "Микросервисы->Redis" панели управления. В случае отключения Redis все настройки всех сайтов будут автоматически изменены на хранение сессий в файлах. Также мы изменили логику работы PHP по работе с сессиями, и в случае, если по каким-то причинам Redis недоступен, PHP не выдает ошибку, а переключается на хранение сессий в файлах.

Хранение сессий 1Хранение сессий 2

Нововведения PHP7.1

  • Добавлен возвращаемый тип «void». Теперь функции и методы, которые не должны ничего возвращать, можно помечать возвращаемым типом void:
function someNethod(): void {
    // работает если return отсутсвует
    // работает с return;
    // не работает если return null;
    // не работает если return 123;
}
  • Добавлен новый псевдо-тип: «iterable»:
function walkList(iterable $list): iterable {
    foreach ($list as $value) {
        yield $value[‘id’];
    }
}

Более подробно о новом типе можно прочитать по ссылке.

  • Появилась возможность разрешать null в типизированных и возвращаемых параметрах:
function callMethod(?Bar $bar): ?Bar {}
    $this->callMethod($bar); // Работает
    $this->callMethod(null); // Работает
    $this->callMethod();     // НЕ работает

Более подробно об новом типе можно прочитать по ссылке.

  • Добавлена возможность использовать отрицательное значение для смещения в строках:
echo $msg[-1]; // вернет последний символ
echo $msg{-1}; // вернет последний символ
  • Разрешено использовать строковые ключи в конструкции list():
["test" => $a, "name" => $b] = ["name" => "Hello", "test" => "World!"];
var_dump($a); // World!
var_dump($b); // Hello

Ознакомьтесь с полным списком изменений в PHP 7.1.

Опубликовано: 24.12.2016
0
37