Pull to refresh

Comments 25

UFO just landed and posted this here
странные люди: не хотят спайков в производительности при зачистке кеша @ не могут прикрутить LRU кеш с зачисткой по достижению критического обьема / по таймеру.
Зато «память используется крайне эффективно»!
Так много текста, дочитал до 3 страницы и дальше не потянул
Лет 5 назад на одном з проектов прикрутил какой акселератор, работающий по такому же принципу
Действительно получил ускорение в 2-3 раза в самых нагруженных скриптах
и забыл про него, работает там сам по себе, менять на другой ни за что не буду.
> Для каждого процесса PHP-пула используется общая память, что позволяет получать доступ к структурам, добавленным другими процессами

А как это работает? Какими функциями пользоваться для сохранения / получения переменной из общей памяти? Ничего такого в документации OPCache не нашел. К примеру, в APC есть функции apc_store() и apc_fetch(). А в OPCache как?
opcache офигенная штука стал, особенно в 7-ке.
Памяти по сравнению с 5-кой жрет в 1.5 раза меньше в среднем.
Эффект дает процентов на 50 лучше.
Правда 7-ку на продакшен в серьезные проекты пока ставить немного стремно, но готовится уже к этому пора)

Правда 7-ку на продакшен в серьезные проекты пока ставить немного стремно, но готовится уже к этому пора)

У меня 7-ка в продакшене уже месяцев 8 и все хорошо. Правда все сильно упирается в задачи которые вы решаете. Ну и да, в случае существующих проектов если у вас нет тестов — придется проводить полное регрессионное тестирование.

если у вас есть что-то работающее, и вы что-то в этом меняете (например меняете версию PHP), то есть шанс что что-то сломается. Вот когда то что работало раньше после изменений ломается — это называется регрессией. Тестирование на предмет выявления "сломанного" называется регрессионным тестированием. Все ж логично.


Есть анализаторы кода на предмет совместимости с 7.

Увы анализаторы не справляются с такими вещами. Вы будете смеяться, а я подобные штуки видел.


И смех в том, что если проект не покрыт тестами, шанс наткнуться на какую-нибудь такую ахинею выше.

Просто Вы говорите:
если у вас нет тестов — придется проводить полное регрессионное тестирование

:)
А как его провести, если проект не покрыт тестами? :)

Увы анализаторы не справляются с такими вещами.

Это как раз правильная оптимизация.
И
If two members compare as equal, their relative order in the sorted array is undefined.
А как его провести, если проект не покрыт тестами? :)

Есть такая штука как ручное тестирование. И полное регрессионное тестирование руками — это очень дорого.


Это как раз правильная оптимизация.

Вот приходит вам проект на самописном фреймворке, тестов нет, кода много, логики много, многое писалось еще под php5.2 (хоть сейчас это и работает под 5.5), и вы тут думаете "а не перейти ли мне на 7.0", и у вас нет 100% уверенности даже после статического анализа не сломается ли чего. Просто потому что анализаторы не хэндлят такие вещи ибо и так очевидно что если чувак завязал логику на детали реализации самого пыха — он дурак.

Я сомневаюсь, что даже при наличии тестов, они будут проверять именно эту функцию. :)

С таким подходом нужно покрывать тестами весь PHP :)

А ручные поверхностные тесты никто в любом случае не отменял.

Я сомневаюсь, что даже при наличии тестов, они будут проверять именно эту функцию. :)

1) тесты покрывают не функции php, а код, который их использует. Соответственно если тесты писал адекватный человек, то такие изменения в поведении они выявят.
2) сомневаюсь что адекватный человек, который бы написал адекватный тест, завязывался бы на это поведение пыха, так что… все совсем плохо)

У нас уже больше полугода 7-ка на продакшене в серьезном проекте.

Я бы немного перефразировал: «стрёмно переводить большие серьезные проекты на php 7, потому что надо всё хорошо проверить, а потом еще ухитриться с минимальным простоем обновиться». У нас на подготовительные работы ушло несколько месяцев, когда выгребали из разных неожиданных мест разные ошибки, связанные с пхп-7. И потом за ночь мы без даунтайма переключили продакшен.

UPDATE. Причем как раз примерно год назад мы приняли решение, что будем на продакшене 7-ку ставить. А дальше пришлось работать.
Nginx+php-fpm на gentoo с включенным Opcache. = )

Очень интересно. Спасибо буду перечитывать статью. Весь материал бегло не охватить.
Их главная задача — единожды скомпилировать каждый PHP-скрипт и закэшировать получившиеся опкоды в общую память, чтобы их мог считать и выполнить каждый рабочий процесс PHP из вашего production-пула (обычно используется PHP-FPM).

Вроде у каждого PHP-процесса свой кеш. Или когда это изменилось?

Его необходимо активировать с помощью обычного процесса активации через php.ini.

Оно, вроде, включено по-умолчанию.

Поэтому никогда не допускаете истощения общей памяти.

Так если низкое значение грязной памяти (читай файлы не менялись), то никакого перезапуска не будет.

Но будьте осторожны, потому что он использует realpath_cache, а это может вам навредить.

То есть для всех ссылок кешируется только исходный файл 1 раз?

Есть realpath_cache_ttl, который равен по умолчанию 120с.
UFO just landed and posted this here
Я просто на разных хитах на странице с phpinfo(), где выводится статистика Opcache ловил разную прыгающую в разные стороны статистику. :)
Сегодня на 7.0.8 все одинаково.

А также интересно, как отображается расход памяти Opcache в top.
Если вы используете современный стек приложений, на базе фреймворка, с большим количеством зависимостей и т.д… тут не обойтись как минимум без гигабайта.

Это ведь не для одного проекта?
Например, Gitlab на рельсах кушает гигабайт. Сколько надо отдать Opcache для аналогичного проекта на Laravel/Symfony?
Сколько надо отдать Opcache для аналогичного проекта на Laravel/Symfony?

можно посмотреть по статистике opcache. Я обычно до 128 мегабайт повышаю, но все сильно зависит от приложения и что оно делает. Для небольших проектов и стандартных 64 мегабайт хватит.

Недавно столкнулся с проблемой использования wildcards внутри «чёрного списка» OPCache. Оказалось, что маски не работают под Windows, о чем, почему-то, не указано в доках. Для исключения папки нужно просто указать путь к ней, без "*" в конце. А вот что делать, если нужно использовать это дело в середине имени файла/папки неясно.

Лучшая статья про конфигурирование OPCache, которую встречал. Наиподробнейшая! Спасибо. В сети русскоязычной много повторяющейся информации про opcache, которая несколько устарела, здесь же и практика конфигурирования и подробная теория работы.

Sign up to leave a comment.