Ответы пользователя по тегу PHP
  • Как интегрировать две системы (PHP framework и .NET WebApi)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    2-ой вариант проще и правильнее
    3-ий вариант можно назвать оптимизацией первого за счет кеширования. В этом случае можно инвалидировать кэш из основной системы (что-то типа webhooks только через очереди).
    Ответ написан
    Комментировать
  • PHP. Умножение 6-ти float, переместительный закон умножения не работает?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    https://en.wikipedia.org/wiki/IEEE_754-1985

    в PHP оператор умножения имеет левую ассоциативность, то есть выражение выполняется слева на право. В вашем случае - по порядку.

    $d4 = ((((6031 * 8109) * 980) * 1909) * 429) * 1714;
    Ответ написан
    Комментировать
  • Фреймворк или чистый php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Хватит... писать... велосипеды...

    Возьмите Laravel и пишите свой новостной портал.
    Ответ написан
    4 комментария
  • Простейший PHP framework для сайта визитки?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Рассмотрите варианты генераторов статических сайтов. Для визитки должно быть норм.

    phrozn.info/en
    https://sculpin.io/
    spress.yosymfony.com
    Ответ написан
    Комментировать
  • Как в php сравнить два многомерных массива и в обоих массивах оставить те значения, которые присутствуют в обоих?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    $filmActors1 = array_column($arr1, null, 'eng_name');
    $filmActors2 = array_column($arr2, null, 'eng_name');
    
    $actors = array_intersect_keys($filmActors1, $filmActors2);
    Ответ написан
    Комментировать
  • MVC php на пальцах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ох...

    Model View Controller. Да ну его, ему уже 45 лет (придумали в 79-ом году). Давайте лучше про Model View Adapter погокорим. это то что все используют в популярных фреймворках последние лет так 10 так точно.

    mvc-mvp-mvvm-6-638.jpg?cb=1375170002

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

    View - это не только HTML, но и вообще представление в целом, а так же логика его формирования. Шаблонизаторы, фильтры, различные функции/объекты помогаютщие нам сформировать view (например форматирование дат, сериализаторы и т.д.) В подавляющем большинстве случаев "представление" наших данных - это HTTP запросы и HTTP ответы. HTML - э то лишь часть HTTP ответа.

    Model - Это целый слой, который может быть представлен в виде кучи отдельных объектиков, структур и т.д. Его задача - делать дела и хранить/менять состояние системы. Тут легко запутаться потому что термин "модель" много чего значит. Воспринимайте его как "слой логики" а не конкретные объекты. И да - база данных и прочая чушь - это детали реализации этого слоя. "не важные штуки" словом. Туда же и ActiveRecord, ORM-ки всякие. Это деталь реализации и все остальные чуваки (view и controller) о них знать ничего не должны (хотя иногда могут в целях упрощения).

    Controller или адаптер. Это опять же не обязательно один объект. это может быть цепочка адаптеров (еще называют фронт-контроллером, middlewares и т.д.). Его задача весьма простая. Получаем представление данных на входе (HTTP запрос), определяем что надо делать, и просим модель что-то сделать (ни в коем случае не меняем ничего самостоятельно в контроллере, он только просит). Потом мы можем попросить модель вернуть нужный нам кусок состояния, и попросить View сформировать представление (HTTP ответ).

    Как-то так. В целом же это я сейчас описал "идеальный мир". Вся суть этого подхода - разделение логики презентационной и логики приложения. Зачем это надо? что бы было проще жить! Обычно UI приложения или способы взаимодействия с ним меняются почаще логики или как минимум в разные моменты времени. Адаптеры в этом случае служат промежуточным слоем, они ничего сами не делают, это "переводчики". Они просто переводят то, что сказано в запросе в язык понятный приложению и обратно.

    Но на начальной стадии можно слегка нарушать эти правила, делать толстые контроллеры и т.д. В этом случае бизнес логика будет потихоньку "вытекать" из модели. Это не хорошо, и на хоть сколько нибудь больших проектах может привести к проблемам. Потому важно находить баланс.
    Ответ написан
    Комментировать
  • Качество кода ради производительности?

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


    Нет, достаточно просто настроить opcache нормально:

    1) использовать автозагрузчик который генерит вам composer (обязательно с флагом -o, тогда он сдампит жирную мэпу классов и не будет дергать файловую систему просто так)

    2) Отключить инвалидацию кэша в opcache (opcache.validate_timestamps=0) и сбрасывать кэш вручную при деплое

    3) проверить через API opcache как там по выделенным ресурсам. Для вашего теста скорее всего дефолта хватит за глаза. Для больших проектов уже можно поиграться с размерами буферов. Читать в документации о функциях opcache что бы статистику собирать.

    4) обновитесь до php7

    p.s. среднее время ответа для простеньких запросов - 30ms, память - 10-15Mb. Если запускать симфони в php-pm, то запросы отдаются за ~10-15ms, потребление памяти на запрос посчитать немогу (так как все запущено как демон). Но этот вариант пока рекомендую для очень простых апишек где нужна скорость реакции системы.
    Ответ написан
    2 комментария
  • Зачем нужны обертки на request data?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    помимо GET/POST есть еще PUT/PATCH, а еще нынче часто присылают в качестве тела запроса JSON. И работать с сырыми заголовками/телом ответа как-то не очень удобно. А еще есть проекты типа php-pm которые поднимают свой HTTP сервер из под CLI, то есть вообще другое SAPI.
    Ответ написан
    Комментировать
  • Написание первой CMS. Как лучше?

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


    Именно так. Я бы даже сказал годика так 3 хотя бы, и пару десятков разных проектов. Важно что бы вы получили разный опыт.

    Неужели чтобы написать даже самую простую CMS для личных элементарных нужд придется изучать куча всего другого чтобы выстроилась точная картина о ее разработке?


    нет, если вы не будете писать велосипеды и возьмете фреймворк как готовую основу.

    но интерес составляет написать самому

    Начните с фреймворка:

    - библиотека для рендринга шаблонов (буферизация вывода, работа с файловой системой немножко)
    - библиотека для маршрутизации запросов (прошаритесь в регулярках)
    - библиотека для работы с базой данных (не ORM, начните с Table Data Gateway или DAO хотя бы. Прошаритесь в SQL минимально).
    - Ядро, связывающее все это вместе. Желаельно с какой-то концепцией мидлвэров, что бы все остальныекомпоненты ничего не знали о ядре. (прошаритесь в HTTP)

    В целом же писать CMS очень и очень скучно и долго. Вы намного быстрее прошаритесь во всем что надо делая отдельные компоненты. Благо сейчас век composer-а и вы можете крутить и вертеть фреймворками как хотите, подменяя чужие компоненты на свои.
    Ответ написан
    6 комментариев
  • Есть ли анализатор неиспользуемого кода PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    попробуйте прогнать через phpdepend или phpmetrics. Это весьма полезные инструменты для анализа кода и отыскивания "интересных" мест.
    Ответ написан
    Комментировать
  • Как создать единую авторизацию через разные сервисы?

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


    Если сервис вернул email - смотреть по email. А если нет - вы не сможете на 100% быть уверены что это два тех же человека. Все просто.

    Для авторизации через соц сервисы есть куча реализаций под oauth2.
    Ответ написан
    2 комментария
  • Функция диапазона ip?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    php.net/manual/en/function.ip2long.php
    php.net/manual/en/function.long2ip.php

    то есть работаем с IP как с числом.

    updated

    добавил свой вариант функции:

    function ipRange($startIp, $endIp) {
        $start = ip2long($startIp);
        $end = ip2long($endIp);
    
        return array_map(function ($ip) {
             return long2ip($ip); // нам не надо проверять эти условия с нулями и 255.
        }, range($start, $end));
    }
    Ответ написан
    5 комментариев
  • На что это больше похоже: паттерн или говнокод?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Никакого отношения сингелтону этот код не имеет.

    с какой целью его автор создает экземпляр объекта в статичном методе


    У этого приема много названий. По сути это статический метод-фабрика, еще можно встретить "именованный конструктор".

    class User {
        private function __construct($email, $password) { /* ... */}
        public static function create($email, $password) { 
             return new static($email, $password); 
        }
        public static function createWithProfile($email, $password, UserProfile $profile) {
             $user = static::create($email, $password);
             $user->profile = $profile;
             return $user;
        }
    }
    
    $user1 = User::create('example@example.com', 'example');
    $user2 = User::createWithProfile('example@example.com', 'example', new UserProfile(
        $firstName, $lastName, $avatar /* ... */
    ));


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

    Отличие тут в том что мы не возвращаем экземпляр класса, он однаразовый. Только для этой последовательности.

    Почему бы не сделать так, спросите вы:
    (new Reboot())->reboot();

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

    По сути можно было бы спокойно сделать это обычной функцией, но автор посчитал что так будет читабельнее. Говнокод часть тут только имя класса - Reboot. Имена классов, интерфейсов и т.д. должны быть существительными. Мы описываем тип объектов. Но это единственное место к которому я могу придраться.
    Ответ написан
    2 комментария
  • Как обойти прерывание выполнения программы на PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Подскажите, пожалуйста, как решить этот вопрос?


    очереди, max_execution_time = 0, демоны (php cli процесс)...
    Ответ написан
    Комментировать
  • Стоит ли беспокоиться о масштабировании на этапе разработки?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    redis, у него есть pub/sub интерфейс так что можно заставить общаться демоны через него, можно хранить в нем сессии...

    Частенько задумываясь о будущих нагрузках

    Тогда вы должны писать нагрузочные тесты, а не филосовствовать о том что можно еще сделать просто-так. В целом если вы не занимались настройкой ядра у вас начнутся проблемы уже на 1000-е активных пользователей (по умолчанию PHP не умеет в stream_select обрабатывать более ~1024 файловых дескриптеров, а операционная система и вовсе по умолчанию ограничивает количество всех файловых дескрипторов на процесс.

    Горизонтальное масштабирование web socket серверов нужно когда у нас количество активных пользователей которые одновременно пользуются системой доходит ближе к 10К а то и больше (нагрузочные тесты все покажут).

    То чем вы занимаетесь называется преждевременной оптимизацией.
    Ответ написан
    Комментировать
  • Почему функция времени работает не верно в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    time выдает время в UTC

    The documentation should have this info. The function time() returns always timestamp that is timezone independent (=UTC).
    Ответ написан
    2 комментария
  • В чем профит такого способа написания if()?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать
  • Тонкости авторизация через php?

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


    это надо делать только при выводе информации. Я что уже не могу слэши в пароле использовать? или кавычки.

    //удаляем лишние пробелы

    Я что уже не могу использовать использовать пароль из трех табуляций? Ну ладно, это можно оставить.

    include ("bd.php");/


    выносите подключение зависимостей в начало файла. И сделайте что-то типа фабрик для управления зависимостями, сейчас у вас все размазано.

    $result = mysql_query("SELECT * FROM users WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином
    $myrow = mysql_fetch_array($result);


    функции mysql_* являются устаревшими, и их наконец-то выпилили в PHP7. Используйте PDO и prepared statements для предотвращения SQL инъекций.

    if ($myrow['password']==$password) {


    0 == 'false' // true

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

    В целом же ваш код заставляет меня вспомнить 2005-ый год...
    Ответ написан
    Комментировать
  • Можно ли решать олимпиадные задания про программированию на PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    можно, язык программирования для олимпиадных задач по программирования важен настолько же, насколько эти самые олимпиадные задачки для реальных навыков.
    Ответ написан
    2 комментария
  • Когда использовать методы когда объекты php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    где их использование оправданно?


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

    Бизнес объекты же лучше описать объектом, таким образом мы будем знать структуру объекта, можем трекать тип объекта и т.д. Это понижает вероятность ошибок.

    В целом же в PHP можно удобно использовать только ОО подходы (при построении архитектуры приложений, это не значит что мы не можем применять идеи функционального программирования, и не путаем это с процедурным подходом), потому все сводится к простым штукам типа инкапсуляции, полиморфизму, принципам SOLID и GRASP. По умолчанию все должно быть объектами и все должно иметь свой тип. Далее уже можно упрощать в зависимости от требований.
    Ответ написан
    Комментировать