180 likes | 461 Views
Как в Badoo на PHP5 перешли. Апгрейд в большой системе на 50 миллионов пользователей Алексей Рыбак Badoo Development. Badoo.com: что это ?. Гибрид сайта знакомств и социальной сети 65 .000.000 пользователей Users/Developers : c ильно больше 1.000.000 ;)
E N D
Как в Badoo на PHP5 перешли Апгрейд в большой системе на 50 миллионов пользователей Алексей Рыбак Badoo Development
Badoo.com: что это? • Гибрид сайта знакомстви социальной сети • 65.000.000 пользователей • Users/Developers : cильно больше 1.000.000 ;) • В мировом Top-200 по Alexa с 2007 года • 5.000.000 посетителей в день • 1.000.000 загрузок фотографий в день • MySQL, PHP, C/C++, Linux, nginx, memcached • 300.000.000 запросов в день на PHP-FPM • 10.000 запросов в секунду на PHP-FPM
Переход на PHP5 • Оказался неожиданно долгим • Большому проекту свойственен консерватизм • Слишком велики инерция и ответственность • Банально десятки мегабайт кода • «Новое» и «здоровское» само по себе не является ценностью
Переход на PHP5 • Кто не идёт вперед – тот идёт назад • Чашу весов перевешивают тесты • Прогноз: до 25% прирост CPU • От первой попытки до окончательного перехода – больше года • Активного времени – около месяца • Перешли с 4.4.9 на 5.3.2-dev (октябрь 2009)
План перехода на PHP5 • Обратная совместимость: код должен работать одинаково под PHP4 и под PHP5 • В любой момент откатываемся и решаем проблемы (может занимать долгое время) • На devel-серверах PHP5 и PHP4 живут параллельно • Тестируем, вычищаем ошибки • Плавное переключение веб-кластера • Плавное переключение скрипт-кластера • Карантин: в течение месяца никаких PHP5 фич
Наиболее неприятные проблемы • E_STRICT • flock/fork • strtolower + locale
E_STRICT • 100% совместимость между PHP4 и PHP5 «из коробки» невозможна • Патч#1: отключаем compile-time сообщения • $o = & new O() • Остаётся довольно много exec-time ошибок • static calls, которые не объявлены как static: PHP4 ругается на синтаксис • func(&$o): в PHP5 объекты по ссылке автоматом, в PHP4 код просто не будет работать, если убрать “&” • И много всего прочего
E_STRICT • Отключить все E_STRICT через error_handler • Включать порционно после карантина и вычищать • Почти всё староеработает в пятёрке корректно • Несмотря на огромное количество E_STRICT ошибок • Мы до сих пор их вычищаем ;)
flock/fork • Проблема у оффлайн-скриптов • Разного рода cron-обработчики, очереди, статистика… • Старт периодически по крону • flock(), чтобы не плодить копии
flock/fork • Папа рожает детей через fork() • Дети выполняют какие-то задания • Папа «пасёт» детей – они рождаются, умирают, рождаются снова, идёт обычный процесс • В PHP5 новые streams • Ребёнок, умирая, снимает lock, который ставил папа! • Вся наша система валится – куча копий
flock/fork • http://bugs.php.net/bug.php?id=47227 • [2009-01-28 06:44 UTC] jani@php.net RTFM: man 2 flock man 2 fork The behaviour is exactly how it should be and is. • Ну и пожалуйста, пишем патч#2
zend_str_tolower • Внутренний перевод PHP-имён с использованием текущей локали (LC_CTYPE, case conversion) • В PHP4 такого не было – добавили в пятерке • Проблема выглядит удивительно • В логе вдруг высыпает масса ошибок вида «неизвестный класс-функция» • Всё 100% подключается
zend_str_tolower • Проблема только у турков!!! • У турков есть две “i” – с точкой и без • В турецкой локали ASCII “I” не переводится в i • Согласно википедии, проблема может найтись и в других языках (азебайджанский, казахский, курдский …) • http://en.wikipedia.org/wiki/Dotted_and_dotless_I
Что происходит у турков • ASCII код IndexPage компилируется в оп-код (I => i) • На стадии выполнения меняется locale • Какой-то include снова зовет compiler: в коде снова используется IndexPage • В турецкой локали имя приводится иначе • На стадии выполнения Fatal error: не можем найти объект в оп-коде • http://bugs.php.net/bug.php?id=18556 • Баг также из разряда «висяков», патч#3
PHP5 Badoo patches • E_STRICT • flock/fork • zend_str_tolower/locale • http://alexeyrybak.com/php5-badoo-patches.html
Cпасибо! • Вопросы? • alexey.rybak@gmail.com • http://alexeyrybak.com/php5-badoo-patches.html • Удачи!