Symfony 2. Проект миграции на php 7 с php5.5. Проблемы с производительностью

У меня есть один проект ~ 4y old, я начал с 5.3 и Symfony 2.0, перенесенных на 5.5 и S2.3. В настоящий момент я перешел на S2.8, и я хочу перейти на php 7.

Как было так много кучи в производительности PHP 7, я очень хотел проверить производительность своего проекта в dev env.

Так работает бенчмарк в dev env; служба находится на бродячем хосте, имеющем как php5-fpm, так и php7.0-fpm, закрывая один и устанавливая другой.

Я бы ожидал, что php7 превзойдет php5, но в основном кажется, что php7 в 1,5-2 раза медленнее на моем локальном dev env.

Что я делаю неправильно? Или мне нужно каким-то образом переписать приложение?

phpinfo: php 7 http://pastebin.com/a6a76vE2 php 5 http://pastebin.com/4GBXNmBB

P.S. Да, я понимаю, что текущие тесты в локальном dev env не на 100% действительны и чисты, но мне нужно только понять, если php7 быстрее, чем php5, как он сказал.

U1

Самое смешное в том, что blackfire ясно показывает, что php 7 ~ 45% быстрее, чем php 5. Но когда я оседаю, я вижу, что производительность ухудшается.

U2

Вот более или менее моя пользовательская конфигурация для dev env. То же самое для php5.5 и php7:

[Date]
date.timezone = Europe/Tallinn

[PHP]
memory_limit = 512M
expose_php = Off
cgi.fix_pathinfo = 0
post_max_size = 10M
upload_max_filesize = 10M
max_execution_time = 60
realpath_cache_size = 4096k
realpath_cache_ttl = 7200

error_reporting = E_ALL | E_STRICT
log_errors = On
error_log = /var/log/php.errors.log

display_errors = On
display_startup_errors = On
html_errors = On

; xdebug
xdebug.remote_enable = On
xdebug.remote_port = 9001
xdebug.max_nesting_level = 200
xdebug.remote_log = /tmp/xdebug.log
xdebug.remote_connect_back = on
xdebug.idekey = "vagrant"

[opcache]
opcache.enable_cli=0
opcache.save_comments=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=66000
opcache.fast_shutdown=1
opcache.enable=1
opcache.revalidate_freq=5
opcache.validate_timestamps=1

Ответы

Ответ 1

Несколько шагов по оптимизации PHP-кода во всем мире и для PHP7:

  • композитор selfupdate
  • обновление композитора
  • композитор dumpautoload -a
  • активировать opcache zend (или любой другой установленный php opcache)
  • в php.ini:
    • opcache.max_accelerated_files = 20000 (или более)
    • opcache.validate_timestamps = 1
    • opcache.revalidate_freq = 10 (или более)
    • xdebug.default_enable = 0
  • перезапустить службу php-fpm7

Если проблемы с производительностью по-прежнему сохраняются, профайл типичной тестовой страницы blackfire.

Ответ 2

Причиной этого, безусловно, будет xdebug. Отключите его, а затем проверьте производительность.

Я должен указать, что в нашем случае после переключения с PHP5.5/Symfony 2.0 на PHP7/Symfony 3.0 мы столкнулись с падением производительности. Это было вызвано тем, как Symfony 2.8+ обрабатывает сеансы php. Он хранит их в локальном каталоге вместо стандартного/tmp-каталога, который почти всегда хранится в ОЗУ. Поэтому, если у вас довольно большое количество файлов сеансов, поиск файла с жесткого диска занимает много времени по сравнению с оперативной памятью.

После удаления этого файла в конфигурации Symfony приложение начало демонстрировать прирост производительности, на который мы надеялись.