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

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Для начала данный код нужно отрефакторить и сделать его хотя бы читабельным. Почитайте про рефакторинг, про ООП...

    Так как по коду нечего сказать скажу методы для ускорения работы уже написанного кода.

    1. Первый вариант это перейти на более последнюю версию php. Например, 7.х, 8.х. Особенно почувствуете разницу при переходе с версии 5.6 на 7.х. Однако какой-то код может сломать. Подходите этому внимательнее.

    2. Использовать кэширование. Кэшировать можно как внедрением в вашем коде кэширования, так и расширениями php вроде opcache.
    Ответ написан
    4 комментария
  • Как сократить данный код?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Тут надо не сокращать, а рефакторить код до более понятного использования. Если у Вас PHP >=7.0, то можно применить такую конструкцию:
    $this->test[$id] = $this->test[$id] ?? 0;
    
    $response = $this->test[$id] >= 3 ? 'нельзя' : 'получил';
    
    $this->test[$id]++;
    
    echo $response;

    Однако от этого особо толку не будет, так как код всё равно не особо читаем
    Ответ написан
    Комментировать
  • Хорошо ли использовать DTO в качестве объекта реквеста для api?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Сложно понять Вашу картину и что имел ввиду Ваш коллега. Об этом лучше спросить самого коллегу. Однако постараюсь помыслить на эту тему...

    1. Конкретно DTO не совсем применима к API в чистом виде и работе с ней. Более правильно в запрос кидать json, а вот этот json уже маппить на вашу DTO, в которой будет высокоуровневая валидация от симфони и php7.4. Пример И само DTO.

    2. Так как у вас система микросервисная, то DTO передавать по сети точно не нужно. Вы можете использовать DTO внутри своего приложения, но не использовать его по сети. DTO позволяет Вам в сервис/хэндлер/команду передавать не сам Request и не кучу параметров, а своё DTO, которая должна создаваться на основе запроса. Таким образом вы отделяете слои и ответственности. При изменении названий параметров DTO не обязательно их менять в API и наоборот. Нет зависимости и это хорошо! Так же хорошо и для тестируемости.

    3. Если вы упомянули ParamConverter это по сути конвектор параметров, но опять же на уровне приложения, а не между запросами сети) Об использовании его можно почитать в документации симфони. С помощью него можно указать в методе DTO, которую он принимает, а конвектор, написанный вами, знает как это DTO создать на основе ваших переданных данных. То есть вы не DTO передаёте в запрос, а те же параметры, просто этот конвектор делает вам из этих параметров DTO. Использовать его или нет - дело ваше. Вы правильно подметили, что в Yii2 такого нет. Можно заморочиться написать свой, но смысла от этого нет вообще) Использовать DTO я бы рекомендовал. Так как профит будет: разделение слоев, меньшая связанность и возможность валидации. А вот использовать конвектор - решение команды или разработчика. Оно позволяет вам создать вашу DTO на основе переданных параметров. Параметры никуда не денутся, они просто сразу лягут в DTO это один профит - чище код.
    Ответ написан
    2 комментария
  • Как сгенерировать уникальное имя для файла php?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Добавляйте метку времени используя time(), используйте UUID, md5 и т д
    Ответ написан
  • Сможете ли Вы с нуля написать свой MVC движок?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Новичкам эта информация излишняя. Вам вполне хватит знаний как работать с каким-то фреймворком, в котором всё это уже есть. Кроме того там есть документация по которой Вы хоть как-то сможете понять как это работает.

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

    С точки зрения практики идея о своём фреймворке не очень хорошая. Вам никогда не хватит сил на развитие и поддержание своего фреймворка. Ведь за большинством Фреймворков стоит большая команда.

    Если хотите взять какой-то минимум от фреймворка — рассмотрите микрофреймворки. Например, Slim.
    Ответ написан
    Комментировать
  • Не отправляются сообщения по SMTP (Swift Mailer)?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Попробуйте TSL и порт 587. Если не поможет вышлите конфиг где вы вводите все настройки
    Ответ написан
    Комментировать
  • Как проверить и получить значение массива?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Как уже сказали - ключ таким быть не должен. Либо это полный ключ и вы ищите по ключу, либо разбивайте его на несколько ключей с дублированием значений.
    2. Вы так же можете сделать тип или теги через запятую по которым это можно будет найти. Массив можно отфильтровать с помощью функции array_filter(), но лучше и правда это перенести в базу. Особенно, если таких значений будет много.
    Ответ написан
    Комментировать
  • Почему laravel не видит мой класс UserService?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Может быть потому, что namespace должны иметь обратный слэш...

    App\Services
    Ответ написан
    1 комментарий
  • Переход к PHP-фреймворку. Какому?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Порядок:
    1. Yii2
    2. Laravel
    3. Symfony

    Yii2 слишком старый, но очень хорош для старта. Можно подождать Yii3, либо сразу начинать с Symfony. Это вам обеспечит много сложностей, но при этом даст хорошее будущее. Так как в хороших компаниях практически все используют Symfony. Если покажется сложным и не подъёмным - вернитесь к Yii2.

    Рекомендую к прочтению:
    Ответ написан
    2 комментария
  • Как получить Id по username телеграм бот?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Через какого-то бота, либо через oauth2 https://core.telegram.org/widgets/login Пример на PHP есть в конце доки.
    Ответ написан
    1 комментарий
  • Как сделать скрипт обратного отсчета времени разный для всех пользователей сайта?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Сохраняйте все возможные уникальные данные о данном визите (визитах) госте в таблицу типа: ip, user agent и т д. Всё, что вам нужно.

    2. Далее выбирайте дату последнего визита из базы данных на основе ip. Но учтите, что один IP может быть у нескольких гостей, например, роутер с которого все сидят. Поэтому можно еще и проверять устройство пользователя.

    Дальше, думаю, разберётесь) В куках не удобно. Очистив куки человек может иметь новый таймер на вашем сайте. Более продвинутые будут этим пользоваться. А история визитов вам понадобится может и не только для этих целей. Даже для посещений своих клиентов с аккаунтом на вашем сайье. Например, если человек имеет аккаунт на вашем сайте и авторизован, то в таблице визитов может быть колонка user_id, которая для гостей будет null.
    Ответ написан
    Комментировать
  • Как установить php-intl?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    yum install php-intl
    Ответ написан
    1 комментарий
  • Как сменить регистр, только у первой буквы в строке?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Используйте функцию ucfirst
    $foo = 'hello world!';
    $foo = ucfirst($foo);             // Hello world!
    Ответ написан
    Комментировать
  • Какой подход программирования на PHP выбрать в 2020 году?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Как вы поняли, на этот вопрос сложно ответить кратко. В программировании, на любом языке большой список материалов изучения, который постоянно пополняется. Всё зависит от Ваших задач и задач Ваших клиентов. Для кого-то главный фактор - быстрота разработки. Для кого-то — простота. Для кого-то стоимость разработки. Для кого-то важна развиваемость проекта написаного кода. Например, есть люди, зарабатывающие настройкой и поддержкой проектов на Wordpress. Поэтому я бы выделил такой путь программиста на PHP:
    1. Самописный код
    2. CMS (Wordpress, Joomla)
    3. Разработка на фреймворке
    4. Разработка на микрофреймворке

    Так как Вы раньше использовали подходы CMS Wordpress, то Вам стоит пойти на следующий этап — разработка на фреймворке. В этом Вы совершенно правильно мыслите.

    Фреймворк (framework, «каркас», «конструкция») — это динамически пополняемая библиотека языка программирования, в которой собраны его базовые модули. Фреймворки создаются для упрощения процессов разработки приложений, сайтов, сервисов. Чтобы не писать модуль в приложении с нуля, гораздо проще обратиться к готовым шаблонам фреймворков, которые и формируют рабочую среду разработчика.

    Достоинства PHP-фреймворков:

    • Производительность. Фреймворки ускоряют разработку. Например, PHP-фреймворк избавляет вас от необходимости писать запросы к базам данных. В фреймворках реализованы базовые функции CRUD, которые необходимы для работы с базами данных.
    • Масштабируемость. Написанные на фреймворках приложения легко масштабируются.
    • Удобство. Код фреймворков лаконичный, поэтому с ним просто работать. Поддерживать легче проект на фреймворке, чем на нативном PHP.
    • Простота. В PHP-фреймворках используются шаблоны проектирования (например, MVC). Это значительно упрощает разработку, делая процесс быстрее.
    • Безопасность. Приложения на фреймворках лучше защищены, чем приложения на чистом PHP.
    • Экономичность. В фреймворках реализован принцип DRY. Это позволяет разработчикам писать меньше кода.

    Какие есть PHP фреймворки для новичков?

    Конечно, PHP фреймворков больше, но не все подходят новичкам. Поэтому, можно выделить два популярных фреймворка у новичков:
    1. Laravel
    2. Yii2

    Путь к изучению фреймворка:

    1. Почитать документацию PHP. Начиная изучение с прочтение документации у вас отложится в подсознании какие-то «якоря», которые будут у вас всплывать в процессе изучения и которые помогут быстро находить в документации нужную информацию. Как минимум вы будете знать, что такое есть, а то некоторые узнают о функциях php спустя многие года. Это позволит вам использовать полноценно функционал, а не ограничиваться пару функциями из примеров.
    2. Изучить ООП. Программировать на PHP можно двумя подходами: функциональным и объектно ориентированным. Последний более популярный и распространенный. Фреймворки написаны используя этот паттерн. Поэтому, перед изучением фреймворка нужно иметь понимание этого подхода. Посмотрите «Неделя ООП» от Дмитрия Елисеева и попробуйте написать свой ООП-код
    3. Установить фреймворк. Начните с установки фреймворка и попробуйте разработать что-то простое, например, Блог или Новости. Yii2 совсем не сложный. Читая документацию, даже без знаний программирования можно сделать что-то простое.
    4. Задаваться вопросами и находить на них ответы. Дальше у вас будет возникать много вопросов. Постарайтесь сначала самостоятельно находить на них ответы: гуглите, смотрите документацию, а уже потом спрашивайте у сообщества.
    5. Перепишите сайт на другой фреймворк. Попробуйте созданный на Yii2 проект переписать на другой современный фреймворк: Laravel или Symfony. Вы получите хорошую практику и навык, который Вам так же поможет в будущем.

    Почему Yii2 подойдёт новичку?

    • Потому что в Yii2, за последние 5 лет, ничего не поменялось. С одной стороны — минус, для изучения — плюс. Ответов и решений полно и они не устарелые, а значит рабочие. Вы хоть что-то сделаете без особых знаний и навыков. Для учебы Yii2 хватит, но не для нового проекта. Как подрастете — возьмёте современный фреймворк или перепишите на Yii3 который будет в конце 2020 или начале 2021.
    • Потому что Yii2 — это RAD фреймворк (для быстрой разработки). Это значит, что в этом фреймворке заложены принципы простоты и быстроты разработки. Для сложных проектов это проблема, а для Вас же — плюс.
    • Потому что он монолитный. Вам не придётся устанавливать кучу дополнительных пакетов, включая библиотеку UI на Bootstrap, jQuery . Вы сможете быстро установить и начать пользоваться Yii фреймворком
    • Потому что Yii2 может сгенерировать код по базе данных используя UI. В Yii2 есть Gii генератор, который прямо по схеме базе данных генерирует вам код в визуальном режиме, поэтому программисты работают быстрее, что не только экономит время, но и уменьшает стоимость разработки.
    • Потому что Yii2 имеет большое русскоговорящее сообщество и целую толпу ярых фанатов.
    • Потому что Yii2 быстрый и безопасный. В этом инструменте также заложен принцип Don't repeat yourself, т.е. неповторения кода. А с помощью Ajax и JQuery фреймворк облегчает создание высокомасштабируемых веб-приложений. Хотя и jQuery в 2020 году устарела.

    Критика в сторону Yii2:

    • Тенденции 2020 года — писать чистый код на голом PHP с переносимыми компонентами, не привязываясь к канонам какого-то конкретного фреймворка. Чтобы в итоге не стать заложником одного фреймворка. Yii2 не следует этим канонам. Фреймворк внутри на 99% противоречит SOLID.
    • Yii2 вышел в 2014-ом году как немного переписанная версия Yii1.1 из 2011-го. Он до сих пор ориентируется на PHP 5.4. Все шесть лет он архитектурно не развивался. С 2018-ого его разработка заморожена. Так что сейчас Вы начнёте практиковаться на заброшенном два года назад фреймворке шестилетней давности, написанном по канонам Yii1 девятилетней давности. Если выйдет Yii3, то там многих из этих канонов уже не будет. Если это одноразовый проект, который один раз написали и забыли, то делать можно на чём угодно и как угодно. Но если проект делают надолго, то чтобы обезопасить себя от сложности таких постоянных переписываний выбирают сразу более свободные и независимые подходы.
    • Для классического frontend — фреймворк всюду тащит свои встроенные ассеты с jQuery. И чтобы перейти на WebPack надо это из всех мест вычищать. А если делать отдельный JS-фронт, то для построения API половина фреймворка оказывается не нужна.
    • Если вам хватает технологий Yii, JQuery и PHP 5.4 шестилетней давности, то получайте удовольствие. Если нравится свежий подход с настоящим DI-контейнером, типами PHP 7.4, PSR и свежим JS/TS с WebPack.
    • Версии Yii 2.1 фреймворка не планируется. Всё обратно несовместимое в 2.0 не проходит. Переход на Yii будет очен затруднён или вовсе невозможен.

    Подитожим. Ваши знания находятся примерно на уровне 2015-2016 годов, как мне кажется. И тут Вам придется решать самому: либо пойти по плавному развитию, пробуя сначала Yii2, со старыми подходами, но ближе к вашим знаниям, а потом перейти на Laravel или Symfony, либо сразу пойти в 2020 год и использовать Laravel или Symfony, которые соответствуют современным подходам, но дальше от Ваших знаний. Можете попробовать установить все и решить для себя на каком фреймворке будете проходить изучение.

    Рекомендую к прочтению:
    Ответ написан
    3 комментария
  • Как правильно выводить информацию из масива?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    foreach ($datas as $value) {
       echo $value['tg_id'];
    }
    Ответ написан
    1 комментарий
  • Как вывести timestamp из MySQL + PHP?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    if($existingInfo["RegisterDate"])) {
        echo (new DateTimeImmutable($existingInfo["RegisterDate"]))->format('d.m.Y H:i:s');
    }
    Ответ написан
    5 комментариев
  • Как отправить pdf файл на почту?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Формируете PDF во время отправки, сохраняете PDF на сервере, затем прикрепляете к сообщению, как вложение. Альтернативой может быть доступ PDF по какой-то ссылке, которую высылаете в сообщении.
    Ответ написан
  • Как сравнить две даты?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $now = new DateTimeImmutable();
    $date = (new DateTimeImmutable())->setTimestamp(1598300173);
    
    if ($now === $date->modify('+30 days')) {
      ...
    }
    Ответ написан
    Комментировать
  • Какую библиотеку использовать для создания сложного pdf файла?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Верстайте как обычный HTML, а потом с использованием dompdf Переводите из HTML в PDF
    Ответ написан
    Комментировать
  • Как выводить прогресс выполнения команды из терминала на сайт?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Пример очередей. Сохраняйте значения в базу данных: id задания, дата, название и статус и на сайте получайте это значение. Можно просто статусы: в очереди, в работе, выполнено. А можно в %. Если %, то можно задействовать websokets для динамики, но только ради этого не стоит их поднимать. Один из примеров подобного есть yii2-queue
    Ответ написан