• Объясните как работает php-fpm?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала почитайте что такое SAPI. Затем представьте что apache + mod_php разделили на web-сервер, который проксирует запросы на php-fpm и отдает статику, и собственно отдельный web-сервер который имплементит SAPI и выполняет запросы связанные только с php. То есть статику отдавать мы можем только через php. Суть примерно та же что и у apache2 + prefork + mod_php но оптимизированный только для работы с php. Так же можно поставить на фронт более быстрый и легковесный сервер который умеет проксировать запросы.

    То есть php-fpm это эдакий fast-cgi сервер который постоянно держит готовые для работы пул-процессов (сколько в пуле процессов настраивается, так же как и от какого пользователя их запускать и все такое прочее). Каждый новый запрос уходит в какой-либо процесс из пула, запрос отрабатывает, возвращаем результат тому кто попросил (web-серверу обычно). Если процесс падает (fatal допустим) - поднимаем новый.

    Принципиальной разницы между apache2+mod_php нету, просто упрощается инфраструктура. Наш web-сервер должен только уметь проксировать запросы и отдавать статику, а php-frpm вообще может быть на разных машинах (балансировщиком можно раскидывать запросы). Ну и сами понимаете, nginx + php-fpm будет быстрее обрабатывать запросы чем apache2+mod_php какой бы мы менеджер процессов не использовали в апаче. Минусов по сравнению с apache+mod_php я даже не могу предложить.

    А php-runtime не зависит от этого. Он один на всех, CLI, FPM, mod_php...
    Ответ написан
    7 комментариев
  • Чем отличаются nginx-extras, nginx-full, nginx-light и какой лучше ставить для доски обьявлений (типа aukro, olx)?

    nazarpc
    @nazarpc
    Open Source enthusiast
    Отличаются набором модулей в комплекте.
    В общем случае ставьте пакет nginx, он потянет за собой nginx-full по зависимостях, если будет недоставать модулей - всегда сможете поставить другой пакет.

    Light:
    STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Empty GIF,
    FastCGI, Map, Proxy, Rewrite.

    OPTIONAL HTTP MODULES: Auth Request, Charset, Gzip, Gzip Precompression,
    Headers, Index, Log, Real IP, SSL, Stub Status, Upstream.

    THIRD PARTY MODULES: Echo.


    Full:
    STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser,
    Empty GIF, FastCGI, Geo, Limit Connections, Limit Requests, Map,
    Memcached, Proxy, Referer, Rewrite, SCGI, Split Clients, UWSGI.

    OPTIONAL HTTP MODULES: Addition, Auth Request, Charset, WebDAV, GeoIP,
    Gunzip, Gzip, Gzip Precompression, Headers, HTTP/2, Image Filter, Index,
    Log, Real IP, SSI, SSL, Stream, Stub Status, Substitution, Thread Pool,
    Upstream, User ID, XSLT.

    MAIL MODULES: Mail Core, Auth HTTP, Proxy, SSL, IMAP, POP3, SMTP.

    THIRD PARTY MODULES: Auth PAM, DAV Ext, Echo, HTTP Substitutions, Upstream


    Extras:
    STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser,
    Empty GIF, FastCGI, Geo, Limit Connections, Limit Requests, Map,
    Memcached, Proxy, Referer, Rewrite, SCGI, Split Clients, UWSGI.

    OPTIONAL HTTP MODULES: Addition, Auth Request, Charset, WebDAV, FLV,
    GeoIP, Gunzip, Gzip, Gzip Precompression, Headers, HTTP/2, Image Filter,
    Index, Log, MP4, Embedded Perl, Random Index, Real IP, Secure Link, SSI,
    SSL, Stream, Stub Status, Substitution, Thread Pool, Upstream, User ID,
    XSLT.

    MAIL MODULES: Mail Core, Auth HTTP, Proxy, SSL, IMAP, POP3, SMTP.

    THIRD PARTY MODULES: Auth PAM, Cache Purge, DAV Ext, Echo, Fancy Index,
    Headers More, Embedded Lua, HTTP Push, HTTP Substitutions, Upload
    Progress, Upstream Fair Queue.
    Ответ написан
    Комментировать
  • На чём лучше прокачивать архитектурный навык разработки моделей предметной области и принципов DDD вообще?

    @xfg
    Любой фреймворк с инверсией зависимостей подойдет. На Symfony и Yii2 точно можно сделать. На русскоязычном форуме Yii по теме DDD очень много обсуждений. Но если не увидели единого согласия по DDD, то скорее всего не читали книгу Эванса или Вернона. Если так, то лучше начать с кого-нибудь из них.

    Многоуровневая архитектура рассказывает нам о слоях presentation, application, domain и infrastructure. С однонаправленным потоком данных. Нижестоящий слой, никогда не должен вызывать вышестоящий. Это значит, что к примеру можно выбросить presentation слой и не придется ничего изменять в оставшихся 3.

    Фактически выходит, что в любой момент можно выбросить фреймворк и заменить другим, так как это presentation layer в многоуровневой архитектуре. Можно даже сначала написать application/domain, проверить их юнит-тестами, а только потом уже задуматься о фреймворке. Application/domain слои никогда ни при каких обстоятельствах не должны вызывать методы фреймворка. Контроллеры фреймворка работают с доменной моделью, через вызовы методов application layer.

    Соответственно, при миграции на другой фреймворк, всё что потребуется, это переписать контроллеры (методы очень простые 1-5 строк) и реализации классов в infrastructure layer если вы завязывали их на фреймворк. Хотя лично я бы, не советовал этого делать. Лучше найти/написать отдельные библиотеки/компоненты под инфраструктурный слой, тем самым облегчив себе жизнь в будущем, когда фреймворк умрет или при очередном релизе мажорной версии.

    Symfony под DDD наилучший выбор, он компонентный, можно подтянуть только то, что нужно. С другой стороны Yii2, он монолитный и вы затяните Active Record и кучу всего еще, чем не будете пользоваться, но джуниор придет и обязательно понавызывает AR или чего-нибудь еще в application/domain слоях, чего вы явно не ожидаете. Поэтому в случае с Yii2 нужен будет тотальный контроль. :)

    Про Laravel не пишу ничего, так как не работал с ним. Но судя по беглому просмотру документации, никаких проблем сделать на нем DDD также нет.
    Ответ написан
    4 комментария
  • Опыт использования nWidart/laravel-modules для Laravel. Стоит ли использовать?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Я писал самодельную структуру, очень схожую на эту. С точки зрения правильной модульности - забудь, модули НЕ реаюзабельны. С точки зрения простоты использования и планирования - это круто.

    С точки зрения реального использования - это часто боль, так как 99% пакетов, пишущихся к ларке, полность заточены на дефолтную архитектуру и, в лучшем случае, дают возможность вручную конфигурировать каталоги.

    Стал бы я снова использовать модульную архитектуру в ларавел проекте - да, стопроцентно. Но точно не так, как у laravel-modules пакета.
    Ответ написан
    2 комментария
  • Шаблонизаторы ещё актуальны?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Шаблонизаторы типа Smarty, Twig в 2017 востребованы, если с ними раньше не работал стоит ли смотреть, изучать что бы повысить ценность свою на рынке труда?

    Smarty - вряд ли.
    Twig - вполне себе актуален, я Вам даже больше скажу, он уже интегрирован "из коробки" в довольно популярную CMS по имени Drupal 8 (т.к. он сделан на базе Symfony) и собственно, в не менее популярный фреймворк под названием Symfony. И, Twig отлично встраивается в очень популярный фреймворк (я имею в виду, в ракурсе PHP-*) под названием Laravel, который в свою очередь так же имеет свой весьма неплохой шаблонизатор, под названием Blade.

    Среди прочего, вариация Twig'а есть даже для JS (Node.JS), в качестве альтернативы таким штукам как Pug/Jade например. *По информации одного из наших коллег, такие шаблоны (в JS-вариации интерпретатора) отлично переносятся потом в оригинальный Twig/PHP (имеют хорошую совместимость/переносимость).
    *Сам не проверял, но, доверяю словам автора.

    Или их нативный php всё же их вытеснил
    Из тех шаблонизаторов, что я могу вспомнить, по моему, все "компилируются" (преобразуются) в нативный для системы код (даже Smarty), т.е. если мы говорим про PHP - то соотв. в PHP-код. Парсится шаблон в код не часто и разница в производительности довольно не значительная, в 99% случаев - ей можно принебречь.

    или все ушли во Фронтенд шаблонизаторы?

    У них обычно немного разные категории задач. Если Вы говорите про шаблонизаторы аля Pug/Jade - то, что из них выходит, в конечный не-JS код, интегрируется плохо. То есть, смысл от этого шаблонизатора только для того, кто делает вёрстку, практической пользы при переносе на PHP-движок (и другие не JS-движки) от него обычно нет, либо очень мало.

    Если говорить о чисто клиентских реализациях - генерировать данные на клиенте, в таком объёме, по моему, не кошерно в подавляющем большинстве случаев, с учётом того, что сервер может кэшировать страницу целиком и выдавать сразу готовую (Varnish, например, это если говорить о необходимости высокой производительности), а какой-нибудь полу-мёртвый смартфон, бедолаги, который зайдет на подобный сайт - лопнет от чрезмерного изобилия JS-кода.
    Ответ написан
    Комментировать
  • В чем преимущества ValueObject и DTO?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Преимущество VO в том, что это значения, которые уже проверены на границы и тип. В вашем примере валидация происходит в геттере - это мягко говоря бессмысленно. Вот вам пример
    class UUID
    {
        /** @var string */
        private $value;
    
        /**
         * @param string $value
         */
        public function __construct(string $value)
        {
            if (!preg_match('/^[\da-f]{32}$/', $value)) {
                throw new \InvalidArgumentException(
                    sprintf('Argument "$value" must be correct UUID, actual value: "%s"', $value)
                );
            }
            
            $this->value = $value;
        }
    
        /**
         * @return string
         */
        public function getValue(): string
        {
            return $this->value;
        }
    }


    Дальше в коде вам достаточно делать type hinting на тип VO и все, значение будет корректным. От рефлексии, или runkit вы все равно защититься не сможете.

    -- --

    DTO - это штука, для удобного транспорта данных, между разными частями системы. Например у вас есть метод, который на вход принимает 20+ аргументов (например регистрация), вызывать такое кодло вероятно будет не удобно, но собрав dto вы можете его передать одним аргументом и рассчитывать на то, что данные переданы с правильными типами. Граничные же значения придется проверить, так как в задачу "транспорта" не входит контроль правильности данных между системами, что его используют.

    но вот внутри в тех частях логика которых фиксирована и не может меняться - вполне подходит массив ключ-значение

    Использование KV в контексте DTO/VO - дико хреновая практика, в очень редких кейсах ее использование оправдывает себя. Дело в том, что массив - это набор произвольных данных. Что бы писать надежный код - вам придется на каждом этапе делать проверку правильности этого массива. Что это за проверки?
    * все нужные ключи существуют
    * все значения по этим ключам правильных типов
    * массив не содержит левых данных

    как реализовать на php типизированую коллекцию типа как в СИ

    class MyTypedCollection implements \Countable, \IteratorAggregate, \ArrayAccess
    ...
    Ответ написан
    2 комментария
  • Какие названия классов лучше всего использовать в html разметке?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Это называется методология. https://m.habr.com/ru/post/256109/ Самая популярная БЭМ
    Ответ написан
    Комментировать
  • Что такое Injected stylesheets в Chrome?

    @CrazyFail
    А у меня JSON Discovery вставлял лишний отступ сверху
    Ответ написан
    Комментировать
  • Почему бы не сделать PHP полностью асинхронным?

    @EvgeniiR
    https://github.com/EvgeniiR
    1. PHP умирает на каждый запрос. Это его главное преимущество и особенность. Это допускает очень много вещей, т.е можно не париться закрытием файлов, завершением подключения к БД и т.п. Как только вы захотите писать асинхронно вам про всё это нужно будет помнить.

    2. Итак, плавно переходим к тому что помнить, вобщем то, нужно будет не только вам. 99% всех библиотек/фреймворков etc. для PHP не пригодны к работе асинхронно.

    3. "полностью асинхронным" = отсутствие блокировок? Первое на чем вы споткнетесь - банальные запросы к базе. С дефолтным драйвером они идут синхронно. Точно так же как синхронно работает куча других подключений, и всякие Swoole etc. вынуждены писать над всем этим свои обертки и свои драйвера к БД.

    Вобщем, асинк в PHP это огромное усложнение на пустом месте, и при наличии блокирующих операций не имеет никакого смысла. Сильно проще сменить язык программирования, если вам нужна асинхронщина.
    По описанию вашего вопроса - гляньте RoadRunner, интересная штука. Как раз чтобы сократить оверхед на инициализацию.
    Есть ещё всякие штуки аля https://github.com/php-service-bus/service-bus , но повторюсь, проще подходящий ЯП взять.
    Ответ написан
    6 комментариев
  • Плюсы и минусы Swoole?

    @xtrime
    senior web developer: php, mysql, angular
    1. Такие же как у любого демона - при неаккуратном обращении может утекать память, и нужно следить что бы небыло неотловленных exception, иначе может непредвиденно падать. Желательно использовать вместе с supervisor
    2. Есть laravoole https://github.com/garveen/laravoole
    3. Поднимал для тестов, работает нормально. Нагрузочных тестирований не делал.
    4. Только доки из гитхаба/оф сайта. Развернуть в принципе не сложно.

    UPDATE:
    Основной минус - отсутствие поддержки потоков.

    После добавления поддержки файберов в ядро php 8.1 стандартом стал https://github.com/amphp.
    Ответ написан
    Комментировать
  • Почему на VPS обрывается websocket соединение, если не происходит обмена данными в течение ~1 минуты?

    SagePtr
    @SagePtr
    Еда - это святое
    Библиотеки типа socket.io обходят эту проблему тем, что каждые N секунд (к примеру, полминуты) отправляют что-то вроде пинга (реализованного на обеих сторонах), чтобы заодно и проверить, живо ли соединение (а то некоторые провайдеры или глючные роутеры могут тоже закрывать TCP-соединения втихаря, если через них долго ничего не передавалось).
    Ответ написан
    2 комментария
  • Как заставить работать Swoole сокет сервер в связке с RabbitMQ?

    @acerrusm Автор вопроса
    Есть новости по поводу Swoole + RabbitMQ. Добился от разработчика хоть какого то пояснения ТУТ. Но опять же, пример кода который он выложил у меня не работает. Пробовал сначала на виртуалке, потом на простом ubuntu сервере, но тщетно. Хотя картина более или менее проясняется.

    Написал разработчику о проблеме, но он пока молчит. Потому хочу попросить тех, кто заинтересован, попробовать у себя запустить swoole вместе c rabbitmq. Вдруг все таки я криворук и пример кода рабочий. Если вы столкнетесь с такой же проблемой, то обязательно напишите об этом на гитхабе.

    Шаг 1.
    Установите Swoole
    Если будете устанавливать Swoole, то устанавливайте с помощью команды:
    sudo pecl install swoole-2.1.1

    Не рекомендую устанавливать компилируя, иначе потом запаритесь удалять т.к. uninstaller не прилагается и команда "make uninstall" не сработает.

    Обязательно должна быть версия 2.1.1. т.к. в версиях ниже нет coroutine.

    Шаг 2:
    Установите IDE-helper, что бы было приятнее работать с методами и классами

    Шаг 3:
    Установите phpAMQP. Это репозиторий который swoole форкнул себе и добавил поддержку Swoole. Т.е. команда
    composer require php-amqplib/php-amqplib
    установит только phpAMQP БЕЗ поддержки Swoole и вам нужно будет ручками добавить 2 файлика:
    1) php-amqplib/PhpAmqpLib/Connection/AMQPSwooleConnection.php
    2) php-amqplib/PhpAmqpLib/Wire/IO/SwooleIO.php

    Шаг 4:
    Установите RabbitMQ

    Удачи!

    UPDATE: на StackOverflow помогли с решением: https://stackoverflow.com/questions/49226659/swool...

    Проблема была в том, что в worker.php я использовал экземпляр класса swoole_http_client, который как оказалось работает асинхронно.

    Для синхронной работы потребуется WebSocketClient класс, который можно найти тут

    Далее заменить
    $cli = new \swoole_http_client('0.0.0.0', 2345);
    
        $cli->on('message', function ($_cli, $frame) {
            var_dump($frame);
        });
    
        $cli->upgrade('/', function($cli)
        {
            $cli->push('This is the message to send to Swoole server');
            $cli->close();
        });

    на
    $client = new WebSocketClient('0.0.0.0', 2345);
    $client->connect();
    $client->send('This is the message to send to Swoole server');
    $recv = $client->recv();
    print_r($recv);
    $client->close();


    Все.
    Ответ написан
    4 комментария
  • Плюсы и минусы Swoole?

    @dchistyakov
    Свули - сила. Инстанс годы тянул 1.2к сокетов, 8 потоков давали около 6.8к сокетов на тачку... потратил полгода и переписаля на свули. Слабая сторона - открытие/закрытие соединения (валится на от 600 до 850 сокетов в сек) на второй сек. вистнет. А вот если не допускать лавин, то удалось дойти на той же тачке до 109к сокетов на тачке. Но припое, что при разрыве соединений может упасть в пике, то есть на 100к разомкнет в сек 600, и далее 5 минут пике к 0 и тайм-аут. Мигрировали на NATS в итоге.
    Ответ написан
    1 комментарий
  • Кто писал свою CMS?

    1) Скорее наоборот, смотрел на минусы других и пытался не повторить их.
    2) Консоль и графическая установка.
    3) Не привязывался к конкретному редактору, но по умолчанию шёл summernote.
    4) Нет, специализация должна определяться пользователем.
    5) Да, есть фреймфорк (laravel), Ядро (Platform) содержащее основу и сама CMS
    6) По умолчанию в выбранном фреймворке уже был шаблонизатор (blade), но его использование оставалось на усмотрение пользователя, так же можно поставить свой (twig,smarty, etc)

    Дока
    Репозиторий
    Ответ написан
    Комментировать
  • Стоит ли использовать orchid для портала?

    webdevlix
    @webdevlix
    PHP NoobDev
    Изучал пакет, действительно очень удобно, первое время были нестыковки в БД но, отписал автору пакета и их поправили, полагаю стоит, это существенно ускорит процесс разработки и поддержки проекта.
    Ответ написан
    Комментировать
  • Стоит ли использовать orchid для портала?

    Использую для регионального портала, 47 видов записей, 5 ролей, заполнение через админку и личный кабинет.
    Полёт нормальный.

    a1f3ef4dc4a744749295df4d9941c07d.gif
    Ответ написан
    8 комментариев
  • Как сделать кнопку выходы в sleeping owl?

    Ответ написан
    Комментировать
  • Несколько "php-fpm: pool www" не должно быть?

    @Fixid Куратор тега Linux
    Все нормально. Так должно быть.
    Если вас это очень смущает, то можете уменьшить размер пула в конфиге php-fpm, но в ущерб производительности.
    Ubuntu и Debian прямые родственники с полной пакетной совместимостью. Поэтому в некоторых универсальных пакетах могут проскакивать названия другой ОС.

    Конкретно в вашем случае у вас пользователя зовут Debian-+ и уже от его имени запущен exim4
    Ответ написан
    3 комментария
  • Как поступить с неприятным заказчиком?

    Stalker_RED
    @Stalker_RED
    Потратьте 20 минут, напишите вежливое письмо типа "уважаемый ФИО, т.к. вы два года не оплачивали хостинг, сайт был отключен и удален хостером. Работы по его восстановлению будут стоить столько-то. А услуги по доработке будут оплачиваться отдельно, в зависимости от объема работ".

    И цену поставьте такую, которая сможет компенсировать ваши душевные страдания:)
    Ответ написан
    Комментировать