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


Нововведения 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.