Your browser is not supported anymore. Please update to a more recent one.


Download Chrome

Download Firefox

Download
Internet Explorer

Download Safari

OpenSource

Для нас важно вносить вклад в развитие IT-сообщества. На этой странице собраны наши основные OpenSource разработки и патчи к сторонним проектам.

Главные проекты

SoftMocks

Библиотека, позволяющая «на лету» подменять вызовы функций, методов и значения констант в PHP

Идея у SoftMocks очень простая и отражена в названии: это реализация аналога для runkit, максимально совместимого с ним по семантике, на чистом PHP. Soft здесь подчеркивает то, что он реализован не внутри ядра PHP, а поверх него, без использования Zend API и прочего hardcore. Тот факт, что он на чистом PHP, означает, что мы можем спокойно переходить на новую версию PHP и просто добавлять поддержку нового синтаксиса, а не переписывать расширения с новой версией Zend API и ловить миллионы багов из-за различных тонкостей в семантике.

Библиотека использует PHP-Parser для своей работы и должна подключаться на самом раннем этапе инициализации приложения, до подключения autoload. Файлы переписываются «на лету» и делаются следующие преобразования над кодом:

  • замена прямых вызовов функций на вызов через обертку
  • встраивание кода в начало кода пользовательских методов
  • замена прямых обращений к константам на вызов метода getConst(...)
Такие несложные преобразования позволяют сохранить логику приложения, позволяя «встраиваться» в любое место в коде. Очень большим достоинством SoftMocks является его независимость от версии PHP и совместимость с будущими версиями (при условии, что новый синтаксис не используется).

Thunder

«Облако» Badoo, предназначенное для распределенного запуска заданий по расписанию или через API

В данный момент мы выкладываем лишь часть нашего «облака», а именно — сбор текстовых логов с серверов в режиме реального времени. Система умеет доставлять логи с множества (тысяч) серверов на центральный узел, и кладет логи на конечный сервер в виде файла. Обладает пропускной способностью в сотни мегабайт/сек, а также умеет делить поток данных между разными категориями «честным» образом. Если в одну категорию пишется столько данных, что их невозможно физически успевать доставлять на центральный сервер, то в первую очередь будут доставляться логи остальных категорий, а «большая» категория будет записываться по остаточному принципу.

Blitz

Быстрый и удобный шаблонизатор для крупных интернет-проектов, разрабатываемых на PHP

Blitz родился for fun. Однако, поигравшись с ним немного, нам показалось, что скорость, с которой он работает, и удобства, которые он предоставляет разработчику — стоят того, чтобы выложить его в опенсорс.

Основных «фишек» у Blitz три:
— написан как PHP-модуль на Си, и является одним из самых быстрых движков;
— имеет простой и интуитивно понятный синтаксис;
— позволяет структурировать код удобным и легко читаемым образом.

PHPCF

Badoo PHP Code Formatter. Утилита для форматирования PHP кода согласно заданным правилам

Форматер был создан для того, чтобы менять пробельные символы: переносы строк, отступы, пробелы вокруг операторов, и т.д. Важно отметить, что наша утилита учитывает изначальное форматирование в файле и меняет только те пробелы, которые не соответствуют выбранному стандарту.

Утилита расширяема и поддерживает произвольные наборы стилей. Можно достаточно легко определить свой стиль форматирования, который будет реализовать другой стандарт, отличный от нашего (стандарт кодирования в нашей компании очень близок к PSR).

Android Weak Handler

Реализация android.os.Handler без утечек памяти

Оригинальная реализация Handler в андроиде допускает утечки памяти. Все происходит потому, что Handler не является исполнителем, а всего-лишь объект обертка вокруг Looper. Все что вы помещаете в Handler, передается в Looper. Все объекты в очереди Looper могут быть очищены сборщиком мусора только когда объект отработает (сработает Runnable, например) или когда Looper будет очищен, что никогда не произойдет для MainLooper.

Наш WeakHandler заворачивает все объекты в WeakReference и HardReference. В Looper передается WeakReference, в Handler — HardReference. Таким образом сборщик мусора может очистить их как только Handler очищен.

GoSSHa

SSH клиент для быстрого параллельного выполнения команд на большом количестве серверов

Утилита создана для решения задач деплоя и позволяет исполнять заданные команды на произвольном количестве серверов по SSH. Также поддерживается копирование файлов.

Утилита умеет корректно работать с ssh-агентом, ограничивать используемый трафик и позволяет задать общий таймаут на исполнение операций. Выполнена в виде command-line утилиты и предназначена для интеграции с другими инструментами.

libpssh

Библиотека для быстрого параллельного выполнения команд на большом количестве серверов

Библиотека создана для решения задач деплоя и позволяет асинхронно исполнять заданные команды на произвольном количестве серверов по SSH. Также поддерживается копирование файлов.

Jinba

Real user monitoring (RUM) решение от Badoo

Это набор open-source инструментов для сбора, аналитики и представления производительности и доступности приложения.
js

Hprof-tools

Набор утилит для работы с дампами памяти андроид приложений

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

Pinba

PHP Is Not a Bottleneck Anymore

Инструмент для сбора статистики и мониторинга в режиме реального времени, использующий БД MySQL в качестве интерфейса. Изначально предназначался для PHP, но сейчас есть клиенты для Node.js, Ruby, Python, Java, Go и модуль для nginx.

Особенно полезен для нагруженных проектов со множеством сервисов и баз данных.

PHP-FPM

PHP - FastCGI Process Manager

Продвинутая реализация PHP FastCGI с пулами воркеров, различными вариантами менеджера процессов, поддержкой мониторинга и прочими дополнительными возможностями, которые необходимы для высоконагруженных сайтов.

Включена в ядро PHP начиная с версии 5.3.3 и сейчас используется на большинстве сайтов, написанных на PHP.

Balancer

Решение для автоматизированного подбора весов на backend-серверах

Решение оформлено в виде библиотеки на PHP и занимается тем, что корректирует веса backend-серверов на балансировщике, достигая равномерной загрузки серверов. Более подробно про то, как работает балансировщик, можно посмотреть на нашем выступлении на конференции Highload++ 2015

Патчи

PHPUnit

Набор патчей в библиотеку для тестирования, которые ускоряют подсчёт покрытия кода тестами.

  • Code coverage в Badoo
  • https://github.com/sebastianbergmann/php-code-coverage/pull/186
  • https://github.com/sebastianbergmann/phpcov/pull/8
  • https://github.com/sebastianbergmann/phpunit/pull/989

Nginx

  • Модуль для отправки статистики в Pinba

RocksDB

  • Небольшая правка для экспорта статки в Cишный код

Gogoprotobuf (Go)

  • Проверка required полей в generated marshal/unmarshal
  • Оптимизации сгенерированного кода

Другое

  • Патчи, улучшающие производительность gitphp — просмотрщика истории git-репозитория

PHP и его расширения

  • Патчи для PHP
  • Патч для UOPZ (расширение для PHP для модификации кода во время выполнения)
  • Патч для расширения Judy (альтернативная реализация массивов и мапов разного вида для PHP)
  • Патч для расширения Imagick для работы
    с изображениями
  • Патч для расширения для работы с RAR-архивами
  • Патч для библиотеки для работы с изображениями
    mozjpeg
  • Патч с реализацией доступа к оригинальным
    дескрипторам
  • Флаг O_CLOEXEC для функции fopen()
  • Флаг JSON_UNESCAPED_UNICODE для функции
    json_encode()
  • Патч с исправлением обработки аргументов в функциях
    mb_substr() и mb_strcut()
  • Патч с исправлением внутреннего состояния объекта DateInterval
  • Отслеживание потребления памяти PHP-скриптами
  • Работа с аудио- и видеофайлами
  • Реализация функции freopen() в PHP
  • Возможность получить rusage завершившихся детей данного процесса с помощью функций pcntl_wait() и pcntl_waitpid() (по аналогии с системными вызовами wait3() и wait4())
  • Испавления ошибок (memory leak) в профилировщике
    XHProf
  • Испавления ошибок (segmentation fault) в профилировщике XHProf