- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
https://habr.com/ru/company/vk/blog/527420/
ВКонтакте снова выкладывает KPHP
....
Сгенерировать С++ из PHP — этого мало. Собственно говоря, это самое простое.
Во-первых, в PHP мы используем кучу функций стандартной библиотеки: header(),
mb_strlen(), curl_init(), array_merge(). Их тысячи — и все должны быть
реализованы внутри KPHP с учётом типизации и работать так же, как в PHP.
Реализация всего PHP stdlib (а также KPHP-дополнений), всех PHP-типов с
операциями и допущениями — это называется runtime, вон там квадратик сверху.
Во-вторых, PHP-сайт — это веб-сервер. Следовательно, и в KPHP должна быть вся
серверная часть, чтобы можно было в том же nginx подменить PHP-шный upstream
на KPHP-шный — и всё продолжало работать так же. KPHP поднимает свой веб-сервер,
оркестрирует процессы, заполняет суперглобалы и переинициализирует состояние,
как и PHP… Это тоже хардкорная часть — называется server, квадратик снизу.
И только имея результирующий код C++, написанные runtime и server, всё это можно
объединить и отдать на откуп плюсовым компиляторам. Мы используем g++ — там в
диаграмме есть квадратик g++. Но не совсем так: у vk.com настолько огромная
кодовая база, что этот компилятор не справляется, и поэтому мы применяем патченный
distcc для параллельной компиляции на множестве агентов. В итоге всё линкуется в
один огромный бинарник (это весь vk.com), он раскидывается на кучу бэкендов и
синхронно перезапускается. Каждая копия запускает мастер-процесс, который порождает
группу однопоточных воркеров. Вот они на самом деле и исполняют исходный PHP-код.
Многие технические проблемы остаются за кадром — их не опишешь в статье на Хабре.
Чего стоит один только сбор трейсов при ошибках: ведь в С++ не получить
человекочитаемый стек, а хочется разработчику вообще его на PHP-код намаппить.
Гигантское количество внутренних нюансов, множество подпорок и легаси — но в итоге
продукт хорошо работает и развивается.
PHP и C++... два говна нашли друг друга