Ответы пользователя по тегу PHP
  • Что изучать для создания динамического сайта?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    да и не вся информация запомнится


    Важно не запоминать документацию а просто знать что там есть. Можете по документации майндмэпы строить что бы потом проще было возвращаться.
    Ответ написан
  • Кто ни будь знает про PSR-7?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я конечно нуб, но вы можете мне простым человеческим языком объяснить где и зачем требуется переопределять заголовки, удалять их, добавлять к ним значения и добавлять пояснительные фразы?


    Мидлвэры. Например можно добавить заголовки для поддержки CORS. В итоге об этом будет знать только маленькая надстройка над системой а не вся система. Или к примеру аутентификация.

    Собственно задачи очень разные могут быть, так что возможность такую нужно давать.
    Ответ написан
  • Скорость работы сайта на php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    require_once - влияет ли на скорость работы сайт если этих подключений много?


    Влияет, но если у вас включен opcache то можно этим принебречь. Да и в целом это мелочи. Работа с базой данных занимает намного больше времени чем подобные штуки. Ну и ваша архитектура может убить производительность любого языка, было бы желание.

    Не занимайтесь микрооптимизациями.
    Ответ написан
  • Разумно ли здесь применить redis?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    По мере выполнения со счёта юзера должны списываться деньги.


    Храните счета пользователей как лог транзакций:

    |  user_id | amount | 
    | 1        |  1000  |
    | 1        |  -150  |
    | 1        |  -240  |


    и тогда и на производительность это никак сказываться не будет (последовательная запись штука ооочень быстрая.

    и данные вы никогда не потеряете. А остаток на счету пользователя всегда можно вычислить как SUM(amount).

    Что до вашего вопроса - проще будет использовать rabbitmq, но для начала - у вас есть проблемы с производительностью или вы просто развлекаетесь?
    Ответ написан
  • Как подписать файл по ГОСТ 34.11-94 в Laravel?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Используйте openssl. Там все есть, правда предлагаю вам актуальную версию: https://rt.openssl.org/Ticket/Display.html?id=3311...
    Ответ написан
  • Могут ли в PHP сокеты работать асинхронно?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Могут ли в PHP сокеты работать асинхронно?


    Да. Это называется non blocking sockets а не "асинхронно".

    но не понятно как дальше с этим работать.


    socket_select.
    Ответ написан
  • Как работает взаимосвязь Nginx, php-fpm и php.ini?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Используется для загрузки XMLHttpRequest.


    XmlHTTPRequest это часть API брауера, PHP ничего о нем не знает и не отличает от остальных HTTP запросов (заголовок который по дефолту ставится можно убрать). То есть уберите в своем представлении разницу между ajax и обычными запросами.

    Как это происходит вся эта взаимосвязь?


    nginx проксирует HTTP запрос на php-fpm. Вот и все. Он с ним больше ничего не делает и настройки ограничивающие что можно орабатывать у него свои.

    То есть мы грузим файл в 1 гиг, тело запроса буферизуется (по умолчанию, можно отключить директивой fastcgi_request_buffering но тогда свои ограничения, хотя думаю вам оно не особо важно) и потом прокидывается в пых, где тот смотрим что тело запроса слишком большое (больше сотни мегабайт) и грустит.
    Ответ написан
  • Как лучше всего настроить роутер или какие готовые решения можно использовать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я давно уже хочу опробовать MVC


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

    Запомните, смысл этих аббривиатур (MVC, MVVM, MVP, HMVC) не в самих буквах (компонентах которые они предлагают) а в отношениях между ними. Например в оригинальном MVC вьюшка это не шаблончики, а полноценный кусок кода который сам отвечает за себя. На бэкэнде же вьюшка это обычно пассивна, ее формируют контроллеры. Они же обрабатывают пользовательский ввод. Так что это уже явно не MVC. Ищим другие паттерны и они подойдут. Но отсутствие понимания зачем это все делать обычно приводит к непониманию и плохим решениям.

    Скажем то что вы подразумеваете под MVC на самом деле завется Model2 (насколько я понимаю то что вы хотите сделать) и это абсолютно разные вещи.

    единственный вопрос, который мешает это сделать - это написание самого роутера.


    Возьмите готовый.

    Я искал решение, и единственное что нашел это подключить модуль от Symfony.


    Плохо искали. Вот где нужно искать: packagist.org

    https://github.com/nikic/FastRoute
    Ответ написан
  • Как можно переписать условие на PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Это оптимальный вариант. Быстрее будет только перевести все в хэшмэпы.

    $oldIdsMap = array_flip($arOld);
    $newIdsMap = array_flip($arrOld);
    
    if (!array_key_exists($checkId, $oldIdsMap) && array_key_exists($checkId, $newIdsMap)) {
        
    }
    Ответ написан
  • Многопоточность в JSON PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Или php однопоточный и так не реализуешь?


    Помимо "потоков" есть еще неблокируемые вызовы. Вам именно это нужно.

    Рекомендую эту библиотеку: https://github.com/mpyw/co либо даже лучше https://github.com/recoilphp/recoil
    Ответ написан
  • Какой правильный путь при написании роутинга?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала давайте разберемся с тем что такое "правильно". Правильно в контексте вопроса - это максимально гибко. В приведенных вами ссылке "роутер" влияет на то, как будет устроена вся система. То есть в них мы сначала делаем допущение "у нас будут контроллеры, модели и представление, что бы как в рельсах но по другому).

    Роутер же не должен ничегошеньки знать о контексте своего использования. Вот это будет правильно. Мы просто должы скормить ему какие-то правила маршрутизации, задающие соответствие "uri => mixed" к примеру, а так же иметь возможность скормить ему строчку что бы тот сказал кого все же вызывать.

    Все, на этом зона ответственности "роутера" заканчивается. Грубо говоря самая примитивная реализация роутера:

    // наш примитивный роутер
    function getRoute(array $rules, $uri) {
         return $rules[$uri] ?? null;
    }
    
    // использование роутера
    $action = getRoute([
        '/' => 'indexPage',
        '/about' => 'aboutPage',
        '/blog' => 'blogPage'
    ], '/about');
    
    // больше нам уже роутер не нужен
    // вызываем действие
    call_user_func($app, $action);


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

    Сами же значения карты роли роутеру играть не должны. Хотя мы можем добавить туда какие-либо дополнительные ограничения, вроде поддерживаемый HTTP метод и т.д. Но в этом плане проще сделать так:

    $rules = [
         [ 'uri' => '/blog/page{pageNumber:\d+}', 'method' => ['GET', 'HEAD'] ]
    ];


    далее мы можем сделать загрузчики правил и прочую чушь. Но повторюсь - цель роутера - на основе строчки, представляющей URI выбрат из списка маршрутов подходящий. Роутер не должен больше ничего уметь.

    Запуском же конкретных действий по найденному маршруту пусть лучше занимается другой компонент.
    Ответ написан
  • Какие есть функции обработки переменных с передачей по ссылке в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вместо вот таких конструкций:


    Для начала замечу что такие конструкции допустимы когда мы работаем с массивами, "необъявленных" переменных у нас быть не должно.

    Затем скажу что если вы посмотрите документацию к PHP7 то второй пример будет выглядеть так:

    echo isset($hello) ? $hello : 'empty';
    // vs
    echo $hello ?? 'empty';


    Первый пример странный поскольку я не знаю что такое $world.

    Использование ссылок в принципе должно происходить как исключение, то есть когда наша функция должна возвращать более одного значения (preg_match как пример). В остальных случаях их не стоит использовать так как они пораждают побочные эффекты и чем больше их будет тем сложнее будет работать с кодом.
    Ответ написан
  • Как работает Service Locator?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Создаёт обьект и передаёт его или только определяет и конфигурирует, а создаёт фабрика


    Именно так. Мы когда регистрируем сервис в сервис локаторе, у нас появляются фабрики сервисов. Они могут быть явными (то есть мы явно пишем код который занимается созданием объектов, например так сделано в pimple) или не явно (всякие автоконфигураторы на основе рефлексий как в PHP-DI или конфиги в Symfony). Так или иначе у нас будут появляться фабрики.

    Сервис локатор по запросу сервиса проверяет создавал ли он такой или нет. И если нет - просит фабрику сделать сервис и выплевывает его тому кто запросил.
    Ответ написан
  • Какой из этих подходов в ООП лучше и как они называются?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с самого начала у нас есть более-менее абстрактный класс


    Так не должно быть. "абстрактные" классы это способ устранения дублирования, нам больше важны интерфейсы объектов и полиморфизм. Но конкретно в рассматриваемом примере нам важна только инкапсуляция.

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

    Вот и вся разница. Далее вход идет инкапсуляция. То есть наше состояние должно быть изолировано внутри объекта, и доступ к нему напрямую из внешнего мира должен быть закрыт.

    Если мы хотим создать объект с каким-то состоянием по умолчанию - мы берем первый вариант (либо как в примере прописывваем прямо как значение свойства, либо сэтим в конструкторе).

    Если мы хотим создать "пустой" объект и уже потом определить его состояние - мы выбираем второй вариант. Как правило этот способ создает много побочных эффектов если не контролировать его, да и обычно это делают не потому что так правильно а потому что подругому не умеют (типичный пример - сущности доктрины. Многие просто не представляю себе как с ними работать без сеттеров).

    Если же мы хотим создать объект но он не может быть пустым, объект должен требовать начальное значение в момент создания. Тогда мы просто передаем значение в конструктор. Без этого значения (или с неправильным) мы не сможем создать объект. К примеру если у пользователя обязательно должен быть email и пароль имеет смысл "заставлять" разработчиков явно передавать их в конструктор объекта. Это эдакая вариация.

    А теперь попробуем первый и второй подходы вместе + третий кейс с обязательными параметрами:

    class User {
         private $id;
         private $email;
         private $password;
    
         public function __construct($email, $password) 
         {
               // это ваш первый пример только без наследования, оно не нужно
               // в нашей задаче идентификатор пораждается
               // при создании объекта самим объектом, состояние по умолчанию
               $this->id = Uuid::uuid4(); 
    
               // мы требуем входящие данные что бы задать начальное состояние
               $this->email = $email;
               $this->password = $password;
         }
    
         // мутация состояния, второй вариант.
         public function changePassword($password) 
         {
                $this->password = $password;
         }
    }


    То есть вся разница только в том, откуда приходят данные для формирование объектом своего состояния. Изнутри (первый случай) или снаружи (второй случай). Оба подхода вполне себе можно использовать вместе.

    Ну и да - зачем в вашем примере наследование и нейкий "абстрактный" класс - не понятно. Наследование это не принцип, это механизм для достижения полиморфизма подтипов. С ним нужно быть осторожно, особенно если с полиморфизмом не разобраться сначала.
    Ответ написан
  • Что за PHP фреймворк?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Выложи точку входа (index.php)

    В целом с первого взгляда похоже на codeigniter.
    Ответ написан
  • Будет ли данный функционал избыточен для класса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    не будет ли это излишним?


    Вы будете внедрять в ваши сущности сервисы, а это уже показать плохого решения.

    В таких инструментах как Doctrine это решаетс за счет оборачивания объекта-сущности в прокси-класс, который при обращении к полю будет загружать нужные сущности. В этом случае наша сущность представляет собой простой PHP объект. а за магию отвечает прокси-объект. Максимально гибко. Ну и выходит так что когда мы создаем сущность - у нас это просто объект, когда мы ее достаем из базы - уже обернутое в прокси объект.

    Словом... да это нарушение принципа единой ответственности и сущность начинает делать неподобающие ей дела. Но с другой стороны простота реализации делает этот подход более чем удобным. Так что если вопрос стоит именно "как делать" и при этом вы не хотите использовать готовые инструменты вроде Doctrine, писать что-то подобное самостоятельно будет дико дорого а потому лучше пойти на компромис.
    Ответ написан
  • Кто понял docker?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    для доступа к ФС свой


    Нет, для доступа к ФC используйте именованные волумы (named volumes). Контейнеры (data-only) для этог оне нужны.

    Между собой без проблем, а как отправить это дело на рабочий сервер, не ручками?


    docker registry, либо используем платный либо ставим у себя и там храним образы. То есть если кто-то решил обновиться до php7.0 мы должны заменить базовый контейнер, проверить что все работает, запушить... а у всх все подтянется.

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


    Именно, никакого отношения к докеру. Я обычно миграции накатываю прямо при старте контейнера. Так надежнее.

    Может кто поделиться ссылочкой на статью

    На статью - нет, их много. Могу поделиться тем как я использую docker на своих проектах. Там описан процесс сборки и деплоя в крадце. В идеале сборкой и деплоем должен заведовать CI-сервер а не руками локально:

    https://github.com/intellectsoft-uk/symfony-skeleton
    Ответ написан