Ответы пользователя по тегу PHP
  • Как обезопасить генерируемый PHP скрипт?

    @dimuska139
    Backend developer
    Вот что вам нужно - https://stackoverflow.com/a/15064283. В переменной $str должен быть генерируемый php-код. Я бы это php-код с помощью Twig рендерил и записывал в переменную $str. Название переменной, конечно, надо нормальное дать вместо $str. Это пример просто.
    Ответ написан
  • Микросервисная архитектура: насколько микро? и почему не возникает проблем с долгим ожиданием?

    @dimuska139
    Backend developer
    для расписала нашего монолита из-за проблем с масштабируемостью

    Не очень понял связь между монолитом и масштабируемостью. Если следовать вот этим правилам, то любой монолит будет отлично масштабироваться. Я бы на вашем месте проект привёл именно к соответствию этим правилам, а не спешил перелезть на микросервисы, т.к. и у них проблем хватает.
    Проблема 1:

    Почему только 3? У вашего магазина нет авторизации? Есть - это отдельный микросервис. Рассылка элетронной почты есть? Есть - ещё один микросервис. Смски шлёте? Ещё один. Другое дело, что писать это всё, понятное, дело должен не один человек, и, скорее всего, не всё на php.
    Проблема 2:

    Последовательно (синхронно) в кучу сервисов никто запросы не делает. В Guzzle (библиотека для http-запросов) есть асинхронный режим, кстати. То есть можно сразу сделать обращение к нескольким сервисам и собрать результаты (время будет равно времени выполнения самого медленного запроса). Но вы и с фронтенда можете сделать обращение к нескольким сервисам сразу асинхронно ведь. Если вопрос в авторизации, то для этого можно использовать jwt-токены - их каждый сервис может сам валидировать. Также можно кешировать данные в определённых ситуациях и даже дублировать в разных сервисах (в микросервисной архитектуре это допустимо).
    Проблема 3:

    Обычно никак не решается, как ни странно. Распределённые транзакции - это боль. А общую базу для нескольких микросервисов использовать нельзя - это антипаттерн.

    P.s. возможно, в вашем случае не нужно всё дробить на кучи микросервисов. Это долго, дорого, трудоёмко - и сложно сделать так, чтобы было удобно, особенно когда опыта нет. Попробуйте что-то одно отделить по мере надобности, потом другое. А дробить бездумно точно никакого смысла не имеет.
    Ответ написан
    Комментировать
  • Где можно посмотреть все типпы аннотаций для swagger php?

    @dimuska139
    Backend developer
    Прямо списка доступных аннотаций я тоже не нашёл, но там есть вообще папка с примерами, где есть многие вещи.

    По поводу генерации: вам нужно сделать эндпоинт, в котором будет выполняться следующий код:
    $openapi = \OpenApi\Generator::scan(['/path/to/project']);
    header('Content-Type: application/x-yaml');
    echo $openapi->toYaml();

    При обращении к этому эндпоинту библиотека просканирует ваш проект, ища в нём аннотации и сформирует yaml. Если что-то не так - увидите ошибку.
    Ответ написан
  • Целесообразно ли логирование выносить в отдельную базу?

    @dimuska139
    Backend developer
    Можете создать слейв-реплику - и дамп снимать с неё. Тогда нагрузки на прод не будет. Другое дело, что вообще не ясно, почему для локальной разработки разработчикам разрешается снимать дамп прода. У разработчиков туда вообще по-хорошему доступа быть не должно (только у ответственных лиц). Для локальной разработки должен быть специально подготовлен дамп, причём желательно чтобы в нём были ненастоящие данные или обезличенные (например, имейлы пользователей заменены на фейковые).
    Ответ написан
    6 комментариев
  • Какое окружение вы используете для разработки php?

    @dimuska139
    Backend developer
    Использую следующее:
    1. PhpStorm (IDE). Чтобы он работал быстро, проекты следует держать на SSD.
    2. DBeaver для просмотра содержимого и структуры БД (сами изменения в БД делаю через миграции)
    3. Postman для того, чтобы дёргать эндпоинты, смотреть ответы и заголовки
    4. Docker в связке с docker-compose

    В качестве СУБД обычно использую PostgreSQL, для кеша - Redis. Но это вообще много от чего зависит уже.
    Ответ написан
    2 комментария
  • Правильное ли использование принципов DDD, и чем заменить Repository?

    @dimuska139
    Backend developer
    Вообще-то как раз Repository - это тот слой абстракции, который нужен, чтобы на уровне бизнес-логики (слой сервисов) абстрагироваться от способа хранения данных. То есть, очевидно, нужно использовать Repository.

    Контроллер должен работать только с сервисным слоем. Моделью (Entity) является тот класс, на который вы маппите пользователей, прочитанных из XML-файла. То есть в репозитории надо сделать метод, читающий XML, формирующий коллекцию из Entity (юзеры) и возвращающий ее. На уровне выше (в сервисном слое) надо сделать метод, который как раз вызывает этот метод репозитория. Методы сервиса в свою очередь надо дергать из контроллера, либо из класса консольной команды, если код кроном вызывается. То есть из контроллера дергать репозиторий не принято. А сервисный слой нужен, чтобы в нем держать всю бизнес-логику.
    Ответ написан
  • Как получить содержимое страницы?

    @dimuska139
    Backend developer
    Ставите с помощью Composer библиотеку Guzzle и юзаете с флагом 'allow_redirects' => true - она сама будет следовать по редиректам, если сервер вернет 301/302.
    Ответ написан
    Комментировать
  • Как организовать грамотную доставку образа PHP приложения если необходим общий volume?

    @dimuska139
    Backend developer
    Зачем Вам ОБЩИЙ вольюм, доступный всем контейнерам? Если там ваши php-скрипты, то при деплое собирайте образы, пропихивая туда нужные файлы - и все.
    Ответ написан
  • Как переключить bootstrap вкладку с помощью get запроса?

    @dimuska139
    Backend developer
    А для элементов с классом tab-pane кто будет класс active добавлять в зависимости от get-параметра?
    Ответ написан
    Комментировать
  • Нуждаюсь в code review, что не так с кодом?

    @dimuska139
    Backend developer
    То, как Вы все реализовали, называется Flat PHP. Такой код невозможно поддерживать, развивать или хотя бы просто покрыть тестами. Я бы порекомендовал взять какой-нибудь более-менее известный фреймворк, и эту же функциональность реализовать в нем. По крайней мере, ознакомитесь с шаблонами проектирования. Если говорить конкретно про Ваш код, то переделать надо все. Начиная с отделения шаблона от логики и заканчивая вынесением в конфигурационный файл приватных данных для подключения к СУБД. И, кстати, зачем вам в скрипте код создания таблицы?
    Ответ написан
  • Как спарсить сайт bankrot.fedresurs.ru, когда там нет HTML сразу?

    @dimuska139
    Backend developer
    Selenium или Phantomjs. Лучше первое
    Ответ написан
    Комментировать
  • Raw PHP или Laravel для SPA на ReactJS?

    @dimuska139
    Backend developer
    Не надо писать свой движок. К нему не будет документации, его не проверяет сообщество, баги в нем будут всегда, и хорошо, если будут тесты. Достаточно гибким это решение тоже не будет. Поддерживать и сопровождать такие проекты потом невозможно. Чтобы на голом PHP написать проект с нуля и нормально, требуется колоссальный опыт и отличное знание шаблонов проектирования. Тем более, что все равно в проект вы будете подтягивать различные удобные библиотеки, которые и так используются в известных фреймворках. Например, Doctrine.

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

    Я не говорю, что обязательно нужно использовать таких монстров как Laravel и Symfony для создания API, но микрофреймворк Slim вполне неплох. Насчет "у микрофреймворков также версии быстро меняются" не могу ничего сказать, по крайней мере, код с 3 версии Слима на 4 переносится без проблем. Ведь в том и суть микрофреймворка, что там кода, зависящего от него, почти и нет - вся ваша бизнес-логика независимая.
    Ответ написан
    Комментировать
  • Cтоит ли писать магазин на чистом php?

    @dimuska139
    Backend developer
    Нет, не стоит, используйте CMS. Интернет-магазин - это типовой сайт, функциональность которого практически стандартна. Если писать самостоятельно, то будет крайне долго, ненадежно и не гибко. Я вижу такие плюсы использования cms конкретно для интернет-магазинов:
    1. Для cms-магазов есть куча готовых тем, но можно сделать и свою.
    2. Для cms-магазов есть куча готовых плагинов под любые нужды
    3. В случае чего, изменения в интернет-магазах на cms обычно гораздо дешевле выходят, и разработчика найти проще.
    4. Если делать магаз с нуля самостоятельно, то у него не будет готовой админки. Если делать на фреймворке, то она, может быть, и будет "из коробки", но либо не будет устраивать, либо ее придется сильно допиливать. В cms админка есть, причем она позволяет далеко не только добавлять товары, но и делать многие другие вещи, написание которых на фреймворке займет много времени.
    5. Какими бы некачественными в плане кода они ни были обычно (например, код не соответствует принципам PSR), CMS более надежны, потому что используются большим количеством людей (соответственно, проверяются и допиливаются постоянно). Самописные решения - нет. И хорошо если разраб хотя бы покрыл свой код тестами (что обычно не делается, кстати). То есть качество самописных решений нередко вызывает сомнения.

    Писать интернет-магаз вручную надо в таких случаях:
    1. Очень высокие нагрузки, CMS не справляется даже если используется кеш везде, где только можно.
    2. Очень нестандартный магазин, на CMS ложится плохо.
    3. Реально огромный (под 100к и более товаров) и сложный интернет-магазин
    Ответ написан
    Комментировать
  • Как ускорить отправку письма при заказе?

    @dimuska139
    Backend developer
    Это надо делать через очередь. То есть человек жмет, грубо говоря, кнопку "отправить письмо", на сервере запускается задача отправки письма, отдается обратно ответ, что письмо будет отправлено, а сама отправка выполняется в фоновом режиме.
    Погугли насчет Gearman.
    Ответ написан
    Комментировать
  • Как запретить одновременный запуск PHP скрипта?

    @dimuska139
    Backend developer
    Если у тебя в PHP скриптах используются сессии, то с одного браузера ты параллельно скрипты не запустишь, даже из разных вкладок браузера. Скрипты выполняются последовательно. Попробуй через инкогнито или один скрипт дернуть одним браузером, другой - другим.
    Ответ написан
    2 комментария
  • Как вывести данные с БД, кроме определенных?

    @dimuska139
    Backend developer
    Если user_1 и user_2 - это значения поля name, то почему они не в кавычках? Вы этот запрос пробовали запустить вручную, подключившись к базе данных клиентом? Ошибку должно кидать, по идее.
    Ответ написан
  • Как понять, почему сервер иногда долго отдает сайт?

    @dimuska139
    Backend developer
    1. Включи логирование медленных запросов
    2. Построй индексы к таблицам под медленные запросы, если это необходимо
    Ответ написан
  • Как ускорить работу с API?

    @dimuska139
    Backend developer
    я бы действовал так:
    1. Узнать, какие именно запросы идут в базу данных во время формирования страницы с новым вопросом
    2. Через explain analyze посмотреть, какие индексы в базе данных используются в этих запросах. Если их нет - сделать их.
    3. Возможно, страницы вопросов есть смысл кешировать - тогда они будут отдаваться моментально
    Ответ написан
    Комментировать
  • Как правильно интегрировать API mailgun в PHP?

    @dimuska139
    Backend developer
    По ftp лить код на сервер не правильно. Особенно вместе с папкой vendor. Дело в том, что зависимости, которые туда установились при запуске composer, именно тех версий, которые совместимы именно с той версией PHP, которая на том компе, где ты их устанавливал. То есть если ты на домашнем компе с PHP 7, например, запустил composer, то библиотека установилась в vendor той версии, которая совместима именно с PHP 7. И на сервере, где PHP 5, она нормально работать не будет.
    Ответ написан
    1 комментарий