Yii2 тестуємо на HHVM

Всім привіт! Нещодавно зарелизился Yii2 з купою нових функцій і підтримкою HHVM, розробники говорять про сумісність в 99%. Спробуємо завести все це справа і випробувати в дії на живих прикладах, де будуть вибірки з БД, сериализация (десирализация) даних, json — encode, decode, робота з ActiveRecord. Але перш трохи про саму машині. HHVM — експериментальна віртуальна машина від Facebook для виконання і JIT компіляції PHP коду. За рахунок неї можна збільшити продуктивність в кілька, а то й п'ять — дев'ять разів на ресурсозатратных завданнях. Проект живе і активно розвивається. З приводу виходу нових версій добре написано в статті на хабре.

Що було зроблено, оптимізовано в HHVM:
— Підтримка функціоналу php 5.6 крім деяких функцій на зразок eval, create_function.
— Написаний нову мову програмування Hack — php — подібний мову зі статичною типізацією.
— Перероблений APC сache, альтернативу якій включає в себе HHVM, були прибрані функції серіалізації (десириализации), які, як відомо, дуже обтяжливі ресурсів.
— Прискорені функції з JSON кодування даних, UTF8 / UTF16 перетворень.
— Менш витратний підрахунок посилань — кожен рядок, масив або об'єкт в php мають лічильник посилань, лічильник збільшується, коли змінна зв'язуватися зі значенням, і зменшуватися коли змінна виходить з області видимості. Такі операції посідають значне процесорний час. Був розроблений окремий компілятор, який намагаються уникнути підрахунок посилань, коли це не потрібно.
— Покращено розподіл пам'яті — були оптимізовані проблемні місця. Там де пам'ять виділяється та надалі не використовується, вона звільняється.

Установка HHVM:
В даний час доступна інсталяція пакетів і компіляція вихідних кодів для всіх популярних дистрибутивів.
Подивитися підтримку можна тут:
HHVM (версія 3.3.1) завелася без проблем з пакунків Debian 7.7 і Ubuntu 14.04
Установка
wget-O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
echo deb http://dl.hhvm.com/debian wheezy main | sudo tee /etc/apt/sources.list.d/hhvm.list
sudo apt-get update
sudo apt-get install hhvm


Після установки создаеться файлик конфігурації /etc/nginx/hhvm.conf, в якому вже записані базові налаштування для location. нам залишається тільки створити хост для yii в /etc/nginx/sites-available/
Приклад мінімального конфига
server {
root /www/hhvm.re/public_html;
index index.html index.htm index.php;
server_name hhvm-yii.local; 
include hhvm.conf; 
location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ /\.ht {
deny all;
}
}


Все, встановлюємо Yii звичним способом через composer.
Стартуємо hhvm, перезапускаємо nginx.
HHVM повинна запуститися. Якщо немає, то можна подивитися логи /var/log/hhvm/error.log
Так само можна підкрутити конфігурацію php, hhvm вона своя /etc/hhvm/server.ini.

Час тестів.
Тестування проводилося на старенькому 2х ядерний ноутбук, amd 64, @ 1,9 ГГц, 4 гб ОЗУ:
Debian 7.7,
Nginx 1.2.1,
MySQL 5.5.38
Одна конфігурація: php-fpm 5.6
Друга: hhvm 3.3.1

Кожен тест будемо запускати по 10 разів, обчислюючи середні значення по відпрацьованому часу.

1. Запуск Yii2 з коробки показав практично однакову продуктивність. Мабуть, фреймворк і так досить легкий, щоб щось оптимізувати. Привіт, WordPress )

2. Висновок 300 новин з пагінація і різними віджетами:

$newsList = new ActiveDataProvider([
'query' => News::find(),
'pagination' => [
'pageSize' => 30,
],
'sort' => false,
]);


3. А тепер візьмемо даних побільше, наприклад, 5к товарів, з прописаними зв'язками до постачальникам, магазинах, і категоріям. Виведемо по 300 товарів на сторінку, щоб не розмінюватися на дрібниці. Профіт є, але поки що не такий як хотілося б:

$productList = ActiveDataProvider([
'query' => Product::find()
->where([
'statusId' => 1,
]),
'pagination' => [
'pageSize' => 300,
],
'sort' => false,
]);


4. Стандартна задача. У нас 500 категорій. Підрахувати кількість товарів до кожної категорії. Звичайно, результати можна і в кеш покласти і зберігати count десь в окремому полі. Але нам ось хочеться їх в runtime відпрацьовувати, подивимося:

$categoryList = Category::find()->all();
$listCount = [];
foreach ($categoryList as $category){
$listCount[] = Product::find()
->where(['id_category' => $category->id])
->count();
}

Тут результати вже цікавіше, приріст майже в 4 рази. Непогано так?

5. Серіалізація (десериализация) Наприклад, ми захотіли об'єкти товарів зберігати в якому-небудь Memcache. Подивимося, з якою швидкістю вони будуть запаковываться/ распаковываться. Операція буває досить дорога, не посперечаєшся, особливо на великих даних. Приріст у 3,67 разів:

$productList = Product::find()->all();
foreach ($productList as $product){
$serialize = serialize($product);
unserialize($serialize);
}


6. Часто доводиться кодувати/ декодувати дані в json. Особливо актуально для різних REST Api сервісів або вибірку даних для Single Page Application. Обробка c HHVM вражає, швидше в 5 разів:

$productList = Product::find()->all();
foreach ($productList as $product){
$encode = json_encode($product);
json_decode($encode);
}


7. Ну і наостанок спробуємо створити модель, яка буде писати дані в Redis. Yii2 надає нам прекрасну можливість для цього. Критично в задачах з частою записом, вибіркою даних, де не має сенсу кешувати дані:

for ($i=0; $i < 5000; $i++){
$customer = new Customer();
$customer->attributes = ['name' => $i];
$customer->save();
}


Таблиця результатів:
Назва тесту Yii2 php5-fpm (сек.) Yii2 HHVM (сек.) Приріст швидкості
1. З коробки 0,10 0,09 1,1
2. Висновок новин 0,17 0,16 1,06
3. Висновок 5к. товарів 1,51 1,12 1,34
4. Підрахунок товарів в категорії 2,82 0,63 3,61
5. Серіалізація / Десериализация 3,24 0,88 3,68
6. JSON (encode, decode) 2,73 0,51 5,35
7. Redis (Model ActiveRecord) 10,53 4,43 2,37
Ну, ось і все, результати в цифрах і на особу, в принципі досить не погано, від HHVM залишилися тільки позитивні враження, не треба ніяких магічних милиць і танців, щоб все це завести. Все що потрібно в PHP і Yii прекрасно підтримується. Думаю треба ще поганяти на якихось невеликих проектах. Подивитися стабільність роботи, не буде падати, якщо є у когось досвід використання в продакшені було б цікаво послухати. Так, якщо у вас є пропозиції щодо тестування, пишіть, спробуємо прогнати. Всім Удачі!

Трохи посилань.:
Yii2
HHVM

Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.