Привет. Про kPHP от ВКонтакте уже многие успели прочитать и в прошлом топике, и где-то ещё, но деталей, конечно, пока было мало. Для удовлетворения собственного любопытства и интереса со стороны сообщества, мы обратились за комментариями к первоисточнику, то есть Павлу Дурову, который порекомендовал мне поговорить о kPHP с ребятами из команды — Олегом Илларионовым и Василием Бабичем, которые отвечали за перенос ВК на рельсы свежей разработки.
Первым делом я задал те вопросы, которые звучали в комментариях к анонсу: что с ООП, кто быстрее — слон или кит Java C# Go или kPHP, в каких проектах kPHP будет наиболее полезен и так далее. Кроме того, мы поговорили о планах развития и, немного, о других разработках и «кодовой» кухне ВК.
Олег, Василий, привет. Итак, что же такое kPHP? В чём его суть?
Олег Илларионов:
Привет! kPHP — транслятор PHP в С++, который, в том числе, анализирует код, выводит типы переменных, а там, где однозначно вывести не удалось — использует универсальные переменные, в которых могут храниться данные любого типа.
Конечно, kPHP это не штука которая скомпилирует любой PHP-код и он будет работать — на деле kphp очень хороший статический анализатор кода, который находит ошибки, как потенциальные так и фактические. Кстати, при переводе сайта (речь идёт о ВКонтакте) даже было запущено несколько небольших нововведений, которые были сделаны давно, но из-за багов в коде не стали доступны широкой публике.
Много вопросов связано как с поддержкой основных методов PHP, так и с ООП. Кроме уже озвученного — как о стандарте, так и об ограниченной поддержке ООП, можете что-то добавить?
ОИ:
В kPHP Есть огромная масса всего, даже вещи которые мы (ВКонтакте) не используем, но пока что нет некоторых очень серьезных штук — например, DOMDocument.
Что касается ООП, то на данный момент оно в kPHP не поддерживается, за исключением нескольких стандартных объектов PHP. Одной из задач при переводе сайта на kPHP было полное избавление от ООП. Но это отсутствие было сделано скорее как фича, основным вектором при разработке kPHP была скорость, Это играет не в пользу поддержки ООП и, кроме того, ООП хорош в первую очередь тогда, когда у вас на проекте есть сотня разработчиков либо в нём обилие интерфейсов.
В комментариях прозвучал классический вопрос: «быстрее ли kPHP чем Java C# Go»?
ОИ:
Зависит от того, что именно тестировать и от того, как написать код. С kPHP очень интересно: например, скорость зависит от того, как именно он выведет тип отдельных переменных. Вообще, kPHP планировался как несовместимый с PHP язык, там есть ряд конструкций, которые, например, позволяют явно задавать типы переменных, чтобы ускорить выполнение. Но из-за того, что у нас много кода (скомпилированный бинарник весит около 300 мегабайт), компиляция занимает не считанные секунды, как планировалось, а минуты — несмотря на то, что kPHP перекомпилирует только изменившуюся часть кода — приходится разрабатывать фичи на обычном PHP, и это пока что не позволяет нам использовать все преимущества.
Василий Бабич:
Сравнение с Java C# Go сложное — скорость kPHP, как уже отметил Олег, очень зависит от кода, который им компилируют — если он хороший, то скорость работы сильно выше, чем у Java / C# — фактически, это чистый С++. А вот если код не очень хороший, то работает помедленнее. Наверное, если очень постараться, то можно придумать синтетический пример, где код аналогичный, но kPHP работает медленнее — но мы такой целью не задавались :)
Мы уже видели красивые графики ускорения загрузки основных страниц ВКонтакте благодаря переходу на kPHP. А какие ещё выгоды может принести использование kPHP?
ОИ:
Существенное преимущество в использовании памяти.
ВБ:
Да, с kPHP значительно меньше использование процессора и оперативной памяти. Насколько я знаю, мы стали использовать почти в два раза меньше серверов для обработки запросов, при том, что они занимаются не только этим — на них еще какие-то системы иногда работают, вроде memcache. Конечно, kPHP в первую очередь предназначен для highload-проектов, что не удивительно, учитывая те задачи, для решения которых мы ведём его разработку.
Некоторыее критически отнеслись к двойному приросту скорости ВКонтакте, указывая на то, что ускорение в 10 раз было бы, конечно, намного более впечатляющим результатом. Так что, в 2 раза всего?
ОИ:
Нужно понимать, что факт ускорения сайта в 2 раза не значит, что kPHP быстрее PHP в два раза, это не так. Дело в том, что помимо выполнения кода очень существенная часть времени тратится на обращения к базам, движкам и так далее. Думаю, само выполнение кода ускорилось более чем в 10 раз.
И ещё по поводу скорости: в kPHP встроен веб-сервер, то есть, в комбинации с ним не нужен Apache.
ВБ:
Да, большую часть времени генерации страницы сейчас занимает не исполнение PHP-кода, а ожидание ответа на запросы за данными (к другим серверам). Конечно, мы стараемся это время ожидания как-то использовать, но реально получается, что ожидания всё равно очень много, его kPHP не ускоряет. Как и сказал Олег, фактический рост скорости значительно выше.
Олег, ты упомянул базы и в этой связи вопрос про них: используете собственные наработки или что-то стандартно-допиленное?
ОИ:
Сейчас мы практически не используем MySQL, разве что только там, где небольшие нагрузки и пока не дошли руки перенести на собственные движки. Там, где данных хранится много они используются уже давно. Их написано гигантское множество, теперь уже сложно представить задачу с которой нельзя справиться без MySQL.
Вообще, целый ряд наших стандартных функций, которые мы предсмотрительно вынесли в отдельную библиотеку, реализованы на C++.
Правда, это решение мы использовали и до kPHP — как известно, в PHP тоже можно добавлять новые функции, написанные на C.
А есть ли в планах ускорение или (вдруг!) раскрытие движков для общественности?
ВБ:
Те, которые написаны нашими ребятами (вместо MySQL) и работают по memcache-протоколу уже достаточно сильно ускорены. Однако, этот протокол не позволяет ускорить всё настолько, насколько мы могли бы. Поэтому мы постепенно уходим от memcache-протокола к своему собственному, который похож на mtproto, описанный в конкурсе для Android — но для серверной стороны (для общения между серверами, отвечающими на запрос и серверами с данными).
Про открытие общественности — да, мы планировали движки на memcache-протоколе открывать, но пока не дошли руки.
Возвращаясь к kPHP, какие у вас планы по его развитию и поддержке? Будете пилить или отдадите на откуп сообществу?
ОИ:
Из ближайшего — ребята планируют добавить ООП, так как если мы захотим встроить mtproto, разработчикам оно понадобится.
Спасибо! И, напоследок, самый главный вопрос: что же такое k?
ВБ:
K — это префикс от слова kitten, которое уже стало традицией в разработках наших ребят :)
Вот такое kPHP-интервью у нас получилось, Хабр, спасибо за то, что прочитали эту стену текста без единой картинки. Чтобы сгладить эту неловкость, добавлю в топик немного префикса:
Ну и, конечно же, если будут вопросы по теме, Roem.ru с удовольствием расспросит ребят о других интересующих сообщество деталях.
Автор: Teodorix