• Какой есть аналог Resque от Rails в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Смысл в том, чтобы делать отложенные job-ы без помощи cron-а, т.е. замена cron-а чем-то более удобным...


    beanstalkd

    по поводу resque можете попробовать вот это: https://github.com/mjphaynes/php-resque - он посвежее.
    Ответ написан
    4 комментария
  • Как сделать строчный калькулятор?

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

    ['10', '+', '10', '*', '2', '+', '10']

    Затем мы должны преобразовать массив в обратную польскую нотацию:

    ['10', '10', '10', '2', '*', '+', '+']

    ну и далее мы уже можем выполнить выражение. Примеры подобного есть в сети.
    Ответ написан
    Комментировать
  • Как рекурсивно удалить файлы и папки с веб-сервера?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    RecursiveIteratorIterator + RecursiveDirectoryIterator

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::CHILD_FIRST
    );
    
    foreach ($files as $fileinfo) {
        $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
        $todo($fileinfo->getRealPath());
    }
    
    rmdir($dir);
    Ответ написан
    2 комментария
  • Нужен ли MAMP или его аналог на ubuntu desktop?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    на ubuntu desktop?


    Нет. apt-get install php7 и вперед к сверешниям.
    Ответ написан
    4 комментария
  • Как сжимать изображения прямо при загрузке на сервер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    чисто теоритически это возможно, особенно с появлением web assembly и возможностью использовать готовые библиотеки для оптимизации графики. Сейчас это весьма затруднительно.

    Есть очень простой способ - aws s3 + aws lambda для загрузки файлов и обработке оных по загрузке на сервер.
    Ответ написан
  • Как должен быть реализован middleware?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    function app(Request $request) : Response {
        return new Response(200, "This is app response");
    }
    
    function myMiddleware(Request $request, callable $next) {
        $response = $next();
        $response->headers->add('Content-Type', 'text/html');
    
        return $response;
    }


    Это общий принцип. Декорация. Смотреть шаблон проектирования "адаптер" и "декоратор".

    updated

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

    Мидлвэром же будет являться любая функция, которая будет декорировать нашу. Задача этой функции такая же как и у функции приложения. Получаем на вход запрос, возвращаем результат. Единственное отличие в том, что в качестве второго аргумента функция мидлвэр получает следующую функцию в цепочке.

    То есть если например мидлвэру нужно сделать что-то с ответом - нам нужно сначала получить этот ответ у следующей функции в цепочке, и затем уже применить свои изменения, сформировать новый ответ и т.д. В качестве примера предлагаю такой вот простенький мидлвэр:

    function prettyErrorsMiddleware(Request $request, callable $next) : Response
    {
         // пробуем получить ответ от следующей функции в цепочке
         try {
              return $next($request); 
         } catch (Throwable $e) {
              // в случае необработанной ошибки, ловим ее
              // и формируем новый ответ с красивой версией этой ошибки
              return renderPrettyError($e);
         }
    }


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

    Поскольку речь идет о PHP мидлвэры можно сделать объектами:

    class PrettyErrorsMiddleware implements RequestHandler
    {
         private $errorRenderer;
         private $next;
    
         public function __construct(ErrorRenderer $errorRenderer, RequestHandler $next)
         {
                $this->errorRenderer = $errorRenderer;
                $this->next = $next;
         }
         public function handle(Request $request) : Response
         {
                // пробуем получить ответ от следующей функции в цепочке
                try {
                    return $this->next($request); 
                } catch (Throwable $e) {
                      // в случае необработанной ошибки, ловим ее
                      // и формируем новый ответ с красивой версией этой ошибки
                      return $this->errorRenderer->render($e);
                 }
          }
    }


    Мы так же можем прервать вызов цепочки наших функций. Например, мы можем сделать мидлвэр который занимается аутентификацией:

    function authentificatedEndpoint(Request $request, callable $next) : Response
    {
        // если мы не передали в запросе информацию о том кто мы и что мы
        // или эта информация не является правдой
        if (!$request->headers->has('X-Authorization') || !isAuthentificated($request->headers->get('X-Authorization'))) {
             // возвращаем ошибку 
             return new Response("You are not autnentificated!", 401);
        }
    
        // все хорошо, можно идти дальше по цепочке.
        return $next($request);
    }


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

    Примерами таких вещей могут быть аутентификация, маршрутизация, CORS, логирование, кеширование, да что угодно! Вот небольшой список того что уже написано: https://github.com/oscarotero/psr7-middlewares#ava...
    Ответ написан
    6 комментариев
  • Возможно ли прочесть имя файла из base64?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вы сохраняете содержимое файла, а сталобыть его имя вам уже не доступно.
    Ответ написан
    2 комментария
  • Как работает front-end?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    https://developer.mozilla.org/en-US/docs/Web/JavaScript

    как минимум вам нужно нормально знать javascript. Без этого углубляться смысла нет. (помимо основ синтаксиса, объектов и прототипного наследования, модулей, нужно еще разобраться с такими понятиями как event loop)

    затем минимально нужно почитать про DOM, как оно там работает, как отрисовывается страница, что такое reflow/repaint и т.д. Всплытие событий и т... Ajax - нынче с ним все просто: https://developer.mozilla.org/en-US/docs/Web/API/F...

    В целом MDN + learn.javascript.ru
    Ответ написан
    Комментировать
  • Как динамически поменяеть имя класса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    разве что так.
    <?php
    use My_Ugly_Class_name as PrettyName;


    В вашем случае не стоит менять имена классов. Как минимум если нет тестов.
    Ответ написан
    Комментировать
  • На сколько оптимально искать выражение по строке в MySQL?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    dev.mysql.com/doc/refman/5.7/en/regexp.html

    на сколько это рационально с точки зрения производительности?


    поскольку индексы использоваться не будут - рационально только на очень маленьких выборках (до 1000 записей например). В вашем случае вам даже регулярки не нужны - достаточно обычного matching/like.

    В идеале для подобных задач стоит использовать вещи вроде Elastic Search. У MySQL хоть и есть поддержка full-text search и весьма неплохая, но далеко не такая же как у эластики.
    Ответ написан
  • Как удалить неявные дубли в массиве php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    $strings = ['лист осиновый', 'осиновый лист'];
    
    $result = array_unique(array_map(function($str) {
        $arr = mb_split('\s', $word);
        sort($arr);
    
        return implode(' ', $arr);
    }, $strings));


    но это не финальный вариант конечно так как меняется порядок слов.
    Ответ написан
    Комментировать
  • Нужно или уже не нужно, чтобы всё правильно работало в IE 6,7 и 8?

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

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


    Это три разных термина.

    - Анонимная функция - функция без имени, что логично, то есть у нее нет идентификатора.
    - Лямбды - по сути синоним анонимной функции. Название получило из-за особенностей обозначения оной: 879d4ef555fb7da171253262dbe57013.png (пруф)
    - Замыкание - это частный случай анонимной функции, которая импортирует (то есть имеет доступ) переменные из внешней области видимости. В PHP замыкание можно получить только явно прописав `use` у анонимной функции.
    Ответ написан
    Комментировать
  • Как узнать размер (кол-во занимаемых байт) объекта в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В PHP есть что-либо аналогичное для определения размера объекта?


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

    Вариант же с memory_get_usage как предлагается выше тоже не будет работать по причине того, что внутри интерприатора все куда сложнее. Для примера:

    class Foo {
        private $bar;
        public function __construct(string $bar) {
           $this->bar = $bar;
        }
    }
    
    $start = memory_get_usage();
    $a = new Foo('test1');
    $middle = memory_get_usage();
    $b = new Foo('longer value');
    $end = memory_get_usage();
    
    echo $middle - $start, PHP_EOL; // 56
    echo $end - $middle, PHP_EOL;  // 56


    Собственно логично что раз у нас размер значений разный то и размер интансов должен быть разным. Не забываем так же что между забором потребления памяти у нас есть так же накладные расходы на ссылку на объект + переменную. Так же не забываем что php выделяет память блоками....

    словом - возможности точно подсчитать размер инстанса в памяти PHP не предоставляет.
    Ответ написан
    Комментировать
  • Как обновлять общие виджеты в Angular?

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


    Пожалуй наиболее удобный способ (но не сказать что самый простой, просто наиболее гибкий) это запретить компонентам получать стэйт самостоятельно и прокидывать его через биндинги снаружи. А снаружи получать стэйт через ресолверы роутера. Соответственно когда вы меняете стэйт в каком-то компоненте, вы просите это сделать сервис, а сервис уже как-то уведомляет систему о изменении стэйта и перезагружаются нужные ресолверы.

    Таким образом состояние будет ходить по кругу, что сильно упрощает тестирование и проектирование приложения, компоненты становятся полностью независимыми и отвечают только за презентационную логику...
    Ответ написан
    2 комментария
  • Почему необходимо использовать англоязычный интерфейс в программах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    ваша мысль верна. Меньше разночтений, проще искать вещи.
    Ответ написан
    Комментировать
  • Как правильно орагнизовать API c использованием REST и SOLID при частичном обновлении сущности?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Действие update для сущности в рамках REST должно выполняться при помощи PUT запроса.


    Фотография пользователя вполне может быть еще одним ресурсом.

    Выполнять один и тот же запрос на оба действия


    Звучит стремно.

    Добавить параметр action к запросу?


    Не restful. Больше на RPC похоже.

    Создать на сервере классы для управления файловыми операциями и формировать запросы вида /user/4/image/?


    users/4/photos или что-то в этом духе.
    Ответ написан
    1 комментарий
  • Можно ли оптимизировать этот запрос к БД?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    ->orderBy(DB::raw('RAND()'))


    вот в этом проблема.

    Если бы у вас гарантировано небыло дырок в ID-никах, можно было бы взять минимальный айдишник, максимальный айдишник, сгенерить 50 айдишек рандомных и сделать простой where in. Все остальные варианты - вариации этого.

    https://www.warpconduit.net/2011/03/23/selecting-a...
    Ответ написан
    Комментировать
  • Что это за фигня на developer.mozilla?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Любой может редактировать страницу. Восстановите справедливость.
    Ответ написан
    1 комментарий
  • Какой из двух вариантов работы с данными в Angular выбрать?

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

    Минусы первого варианта смехотворны по сравнению с плюсами и минусами второго. Есть же такая вещь как кэширование.
    Ответ написан
    3 комментария