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 не выдает ошибку, а переключается на хранение сессий в файлах.

управление способом хранения сессий в php управление способом хранения сессий в php


Нововведения 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
Ознакомьтесь с полным списком изменений в PHP7.1.

24 декабря