Pull to refresh
0
0
Send message

Разработка гибридных PHP/Go приложений с использованием RoadRunner

Reading time18 min
Views25K
Классическое PHP-приложение — однопоточность, тяжелая загрузка (если вы, конечно, не пишите на микрофреймворках) и неизбежная смерть процесса после каждого запроса… Такое приложение тяжелое и медленное, но мы можем дать ему вторую жизнь гибридизацией. Чтобы ускорить — демонизируем и оптимизируем утечки памяти, чтобы добиться большей производительности — внедрим собственный сервер РНР-приложений RoadRunner на Golang, чтобы добавить гибкости — упростим PHP-код, расширим стек и разделим ответственность между сервером и приложением. По сути, заставим наше приложение работать, как если бы мы писали его на Java или другом языке.

Благодаря гибридизации ранее медленное приложение перестало страдать 502 ошибками под нагрузками, уменьшилось среднее время ответа на запросы, производительность увеличилась, а деплой и сборка стали проще за счет унификации приложения и избавления от лишней обвязки в виде nginx + php-fpm.


Антон Титов (Lachezis) — технический директор и соучредитель SpiralScout LLC с опытом активной коммерческой разработки на PHP в 12 лет. Последние несколько лет активно внедряет Golang в стек разработки компании. Об одном из примеров Антон рассказал на PHP Russia 2019.

Демоны на PHP

Reading time4 min
Views76K
Памятка начинающему экзорцисту.

Прежде, чем начать: я знаю, что такое phpDaemon и System_Daemon. Я читал статьи по этой тематике, и на хабре тоже.

Итак, предположим, что вы уже определились, что вам нужен именно демон. Что он должен уметь?
  • Запускаться из консоли и отвязываться от неё
  • Всю информацию писать в логи, ничего не выводить в консоль
  • Уметь плодить дочерние процессы и контролировать их
  • Выполнять поставленную задачу
  • Корректно завершать работу

Отвязываемся от консоли


// Создаем дочерний процесс
// весь код после pcntl_fork() будет выполняться двумя процессами: родительским и дочерним
$child_pid = pcntl_fork();
if ($child_pid) {
    // Выходим из родительского, привязанного к консоли, процесса
    exit();
}
// Делаем основным процессом дочерний.
posix_setsid();

// Дальнейший код выполнится только дочерним процессом, который уже отвязан от консоли

Читать дальше →

Как «декодирование цифрового мира» взорвало зал: топ-10 докладов DotNext 2018 Piter

Reading time8 min
Views17K
Привет, Хабр! Мы выложили видеозаписи докладов с конференции DotNext 2018 Piter. Получился плейлист из 26 видео! В нашей подборке под катом будут десять, но только самых лучших, получивших высшие оценки от зрителей. Если есть силы смотреть все доклады из плейлиста — мы только рады.
 
Традиционно, чем ниже доклад по списку, тем выше его рейтинг. Но очень важно понимать: все доклады имеют примерно одинаковые оценки, около 4,36-4,49 баллов, и расположение может легко измениться, стоит немного поменять методику подсчета. К примеру, на доклад, занявший второе место с рейтингом 4,48, отзывов в несколько раз больше, чем на лучший доклад с рейтингом 4,49. В общем, смотреть нужно всё.

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


Читать дальше →

Три редкоиспользуемые оси в XPath

Reading time2 min
Views81K
Основная мощь языка XPath заключается в осях, позволяющих добраться до любого элемента в исходном документе. Рассмотрим применение таких редкоиспользуемых осей, как ancestor, descendant и self.

ancestor


Задача: получить атрибут id элемента-«прадеда» foo.

Обычно в таких случаях начинают рисовать лестницы:

../../../@id

Такая запись плоха тем, что малопонятна без знания исходного xml. Автор рекомендует в подобных случаях использовать более информативное выражение:

ancestor::foo[1]/@id

Эта запись не только даёт представление об искомом элементе, но и продолжает работать даже в том случае, когда текущий элемент изменил своё положение в дереве.
Читать дальше →

Information

Rating
Does not participate
Registered
Activity