Страницы

Поиск по вопросам

Показаны сообщения с ярлыком phalcon. Показать все сообщения
Показаны сообщения с ярлыком phalcon. Показать все сообщения

воскресенье, 8 марта 2020 г.

Медленный ли Symfony?

#php #производительность #symfony #phalcon


В данный момент, решил попробовать Symfony 3 на PHP 7, и задаюсь вопросом производительности.

Есть задача написания REST API, решил попробовать Symfony 3, написал тестовое API
и попробовал выполнить тест Apache AB (ab -t 10 -c 10) на несуществующий метод, скорость
обработки 2062 запроса за 10 секунд или 206 запросов в секунду.

Делаю тоже самое на Phalcon, скорость 23297 запросов за 10 секунд или 2329.69 запросов
в секунду. Если запускать один запрос, то скорость одинаковая, примерно 90 мс.

В чем прикол? Может я что-то делаю неправильно и где-то нужно настроить что-то, чтобы
на несуществующий запрос была более высокая скорость или это нормальная скорость? Я
понимаю, что Symfony имеет высокую абстракцию, за нее нужно платить, и поэтому производительность
меньше, но тут просто нужно просто вывести 404 ошибку и такой сумасшедший отрыв.

Отрыв Phalcon становится меньше, если взять и добавить операцию поиска в базу и маппинга,
через модель встроенную в фреймворк. Phalcon правда всеравно быстрее, 1600 запросов
против 900 запросов Symfony за 10 секунд.

Конфигурация: PHP 7, Debian, opcache on, Symfony3, Phalcon 3, Кеш Symfony включен,
режим Production.

Подключенные бандлы в Symfony:

new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
new Symfony\Bundle\MonologBundle\MonologBundle(),
new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
new AppBundle\AppBundle(),
new FOS\RestBundle\FOSRestBundle(),
new JMS\SerializerBundle\JMSSerializerBundle(),
new Nelmio\CorsBundle\NelmioCorsBundle()


app.php:

use Symfony\Component\HttpFoundation\Request;

/**
 * @var Composer\Autoload\ClassLoader
 */
$loader = require __DIR__.'/../app/autoload.php';
include_once __DIR__.'/../var/bootstrap.php.cache';

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$kernel = new AppCache($kernel);

// When using the HttpCache, you need to call the method in your front controller
instead of relying on the configuration parameter
Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);




Ладно, делаем замеры потребляемых ресурсов при выполнении запроса в базу данных на
поиск и маппинг:

Выполняем замер Symfony и существующей конфигурации PHP-FPM при работе Apache AB
(ab -t 10 -c 10):

20383 www-data 20 0 380884 26040 18020 R **58,3** 0,3 0:10.35 php-fpm7.0
21394 www-data 20 0 380884 26040 18020 R **57,3** 0,3 0:03.62 php-fpm7.0
21498 www-data 20 0 380884 25908 17900 R **57,3** 0,3 0:02.77 php-fpm7.0
19479 www-data 20 0 380884 25020 18020 D **55,7** 0,3 0:15.08 php-fpm7.0
20481 www-data 20 0 380884 26044 18020 R **52,0** 0,3 0:09.30 php-fpm7.0


Окей, в среднем FPM жрет 52 процента ядра на каждый процесс, делаем замер Phalcon:

24110 www-data 20 0 379016 17876 12848 S **13,6** 0,2 0:03.57 php-fpm7.0
25593 www-data 20 0 378884 17776 12848 R **13,3** 0,2 0:02.30 php-fpm7.0
27023 www-data 20 0 378884 17608 12788 S **13,3** 0,2 0:01.08 php-fpm7.0
25445 www-data 20 0 378884 17780 12848 S **13,0** 0,2 0:02.48 php-fpm7.0
27177 www-data 20 0 378884 17600 12788 R **13,0** 0,2 0:00.91 php-fpm7.0


Phalcon не грузит систему, при одинаковых действиях, загрузка на каждый процесс 13
процентов. 

Я могу предположить, что возможно скорость меньше и нагрузка выше из-за того, что
Symfony дергает кеш с диска каждый раз, а Phalcon по умолчанию все пишет в память.
Если это так, то как перенести весь кеш в память, чтобы исключить нагрузку на диск? 

Кто разбирается в Symfony, скажите, как сделать его быстрее и возможно ли это? В
чем ошибка?
    


Ответы

Ответ 1



фалькон быстрый потому, что написан как расширение для PHP на С Да, симфони очень медленный, вовсе не по тому, что "Symfony дергает кеш с диска каждый раз, а Phalcon по умолчанию все пишет в память.", а потому, что представляет собой достаточно толстую прослойку уймы абстракций. Нет, невозможно. Они предназначены для разных задач. Удобство клепать мелкие сайты с модным MVC на Симфони vs условно-хардкорная производительность чистых сей для фалькона. и нет, у вас не получится как-то супер-быстро разрешать нагрузку на на существующий урл, если все урлы обрабатывает симфони, если урл дошел от веб-сервера до симфони, она его еще как обработает. Придется решать проблему несуществующих урлов как-то по-другому (на стороне веб-сервера) Сделать симфоню быстрее можно, наверное, настроив правильное кэширование (opcache), но тем не менее, с фальконом она не сможет соревноваться по скорости. Т.е. даже симфоневый раутинг (я про 404) будет медленней фальконовского. Кроме того, использование Апача в качестве сервера для хайлоада не oche рекомендуется (возможно, он, конечно, вырос за последние годы) P.S. Как я уже говорил, 36 тысяч вызовов функции substr на один http запрос в Симфони... ну.. окей.

Ответ 2



Привет из 2018, Symfony 4 теперь мега крутой, мощный и при этом быстрый микрофреймворк со своим Flex плагином для Composer-а и конкурентов 0.

среда, 10 июля 2019 г.

Медленный ли Symfony?

В данный момент, решил попробовать Symfony 3 на PHP 7, и задаюсь вопросом производительности.
Есть задача написания REST API, решил попробовать Symfony 3, написал тестовое API и попробовал выполнить тест Apache AB (ab -t 10 -c 10) на несуществующий метод, скорость обработки 2062 запроса за 10 секунд или 206 запросов в секунду.
Делаю тоже самое на Phalcon, скорость 23297 запросов за 10 секунд или 2329.69 запросов в секунду. Если запускать один запрос, то скорость одинаковая, примерно 90 мс.
В чем прикол? Может я что-то делаю неправильно и где-то нужно настроить что-то, чтобы на несуществующий запрос была более высокая скорость или это нормальная скорость? Я понимаю, что Symfony имеет высокую абстракцию, за нее нужно платить, и поэтому производительность меньше, но тут просто нужно просто вывести 404 ошибку и такой сумасшедший отрыв.
Отрыв Phalcon становится меньше, если взять и добавить операцию поиска в базу и маппинга, через модель встроенную в фреймворк. Phalcon правда всеравно быстрее, 1600 запросов против 900 запросов Symfony за 10 секунд.
Конфигурация: PHP 7, Debian, opcache on, Symfony3, Phalcon 3, Кеш Symfony включен, режим Production.
Подключенные бандлы в Symfony:
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new AppBundle\AppBundle(), new FOS\RestBundle\FOSRestBundle(), new JMS\SerializerBundle\JMSSerializerBundle(), new Nelmio\CorsBundle\NelmioCorsBundle()
app.php:
use Symfony\Component\HttpFoundation\Request;
/** * @var Composer\Autoload\ClassLoader */ $loader = require __DIR__.'/../app/autoload.php'; include_once __DIR__.'/../var/bootstrap.php.cache';
$kernel = new AppKernel('prod', false); $kernel->loadClassCache(); $kernel = new AppCache($kernel);
// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter Request::enableHttpMethodParameterOverride(); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);

Ладно, делаем замеры потребляемых ресурсов при выполнении запроса в базу данных на поиск и маппинг
Выполняем замер Symfony и существующей конфигурации PHP-FPM при работе Apache AB (ab -t 10 -c 10):
20383 www-data 20 0 380884 26040 18020 R **58,3** 0,3 0:10.35 php-fpm7.0 21394 www-data 20 0 380884 26040 18020 R **57,3** 0,3 0:03.62 php-fpm7.0 21498 www-data 20 0 380884 25908 17900 R **57,3** 0,3 0:02.77 php-fpm7.0 19479 www-data 20 0 380884 25020 18020 D **55,7** 0,3 0:15.08 php-fpm7.0 20481 www-data 20 0 380884 26044 18020 R **52,0** 0,3 0:09.30 php-fpm7.0
Окей, в среднем FPM жрет 52 процента ядра на каждый процесс, делаем замер Phalcon:
24110 www-data 20 0 379016 17876 12848 S **13,6** 0,2 0:03.57 php-fpm7.0 25593 www-data 20 0 378884 17776 12848 R **13,3** 0,2 0:02.30 php-fpm7.0 27023 www-data 20 0 378884 17608 12788 S **13,3** 0,2 0:01.08 php-fpm7.0 25445 www-data 20 0 378884 17780 12848 S **13,0** 0,2 0:02.48 php-fpm7.0 27177 www-data 20 0 378884 17600 12788 R **13,0** 0,2 0:00.91 php-fpm7.0
Phalcon не грузит систему, при одинаковых действиях, загрузка на каждый процесс 13 процентов.
Я могу предположить, что возможно скорость меньше и нагрузка выше из-за того, что Symfony дергает кеш с диска каждый раз, а Phalcon по умолчанию все пишет в память. Если это так, то как перенести весь кеш в память, чтобы исключить нагрузку на диск?
Кто разбирается в Symfony, скажите, как сделать его быстрее и возможно ли это? В чем ошибка?


Ответ

фалькон быстрый потому, что написан как расширение для PHP на С
Да, симфони очень медленный, вовсе не по тому, что "Symfony дергает кеш с диска каждый раз, а Phalcon по умолчанию все пишет в память.", а потому, что представляет собой достаточно толстую прослойку уймы абстракций.
Нет, невозможно. Они предназначены для разных задач. Удобство клепать мелкие сайты с модным MVC на Симфони vs условно-хардкорная производительность чистых сей для фалькона.
и нет, у вас не получится как-то супер-быстро разрешать нагрузку на на существующий урл, если все урлы обрабатывает симфони, если урл дошел от веб-сервера до симфони, она его еще как обработает. Придется решать проблему несуществующих урлов как-то по-другому (на стороне веб-сервера)
Сделать симфоню быстрее можно, наверное, настроив правильное кэширование (opcache), но тем не менее, с фальконом она не сможет соревноваться по скорости.
Т.е. даже симфоневый раутинг (я про 404) будет медленней фальконовского.
Кроме того, использование Апача в качестве сервера для хайлоада не oche рекомендуется (возможно, он, конечно, вырос за последние годы)
P.S. Как я уже говорил, 36 тысяч вызовов функции substr на один http запрос в Симфони... ну.. окей.

четверг, 21 марта 2019 г.

Phalcon и валидация форм

Все привет. Кто сталкивался с компонентом PhalconValidation? Я, прочитав документацию, не могу понять, как производить валидацию, набросал вот такой вот подход: public function initialize() { $this->add('name', new PresenceOf(array( 'message' => 'Вы не заполнили Имя и Фамилию' )));
$this->add('name', new RegexValidator(array( 'pattern' => '/^[а-яА-ЯёЁa-zA-Z-]+$/ui', 'message' => 'Имя и Фамилия могут содержать только буквы и тире' )));
$this->add('name', new StringLength(array( 'max' => 50, 'min' => 5, 'messageMaximum' => 'Имя и Фамилия не может содержать больше 50 символов', 'messageMinimum' => 'Имя и Фамилия не может содержать меньше 5 символов' )));
$this->add('email', new PresenceOf(array( 'message' => 'Вы не заполнили Email адрес' )));
$this->add('email', new Email(array( 'message' => 'Не корректный Email адрес' )));
$this->add('password', new PresenceOf(array( 'message' => 'Вы не заполнили Пароль' )));
$this->add('password', new StringLength(array( 'min' => 8, 'minimumMessage' => 'Пароль не может быть короче 8 символов' )));
$this->add('confirm', new PresenceOf(array( 'message' => 'Вы не заполнили Подтверждение пароля' )));
$this->add('password', new Confirmation(array( 'message' => 'Пароли не совпадают', 'with' => 'confirm' ))); } Это неправильный подход, потому что если формы пустые, ошибки всплывают все, а не те, что проверяют форму на пустоту. Как исправить такое положение? И да, если установить 'cancelOnFail' => true, то валидация не пройдёт дальше той валидации, которая имеет этот параметр первая в очереди. UPD 06.11.14: Приведу пример валидации. Есть 4 поля, к примеру (имя/емэйл/пароль/и подтверждение пароля). Первым делом валидация проверяет заполнены поля или нет, потом поэтапно каждое поле, то есть изначально он проверяет все поля на пустоту, а потом все поэтапно, и поля не связаны между собой, за исключением пароля, и его подтверждения. Как то так.


Ответ

В чем проблема производить валидацию в два этапа и считать сообщения по выходу с первого? Зачем нужен PresenceOf, если для этого поля уже работает StringLength/Confirmation/Email? Phalcon, конечно, фреймворк с прибабахом, и валидация должна идти по группам, приложение разбиваться по неймспейсам, а объявление всего и вся через анонимные функции - это откровенная laravel-блевня, но здесь-то и задачи как таковой не стоит. Обновление @Bastian, если вы уже в самой задаче бьете ее на два этапа? Валидация одна, этапов два. Хотя объектов валидации будет два, наверное, мне лень было так глубоко лезть