PHP-Дайджест № 111 – свежие новости, материалы и инструменты (12 – 25 июня 2017)



    Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 7.2.0 Alpha 2, пара новых RFC, материалы с YiiConf и FWDays, PHP руткит, и многое другое.
    Приятного чтения!



    Новости и релизы



    PHP Internals


    • RFC: Retry functionality — Предлагается расширить try-catch-finally блоком и ключевым словом retry. В случае бросания соответствующего исключения при наличии retry, блок try будет повторяться:

      try {
          somethingSketchy();
      } retry 3 (RecoverableException $e, $attempt) {
          echo "Failed doing sketchy thing on try #{$attempt}. Retrying...";
          sleep(1);
      } catch (RecoverableException $e) {
          echo $e->getMessage();
      }
      

      try {
          somethingSketchy();
      } catch (RecoverableException $e)
          retry; // Go to top of try block
      }
      

    • RFC: Unary null coalescing operator — Предлагается реализовать унарную версию оператора ??, добавленного в PHP 7.0:

      if ($_POST["action"]?? === "submit") {
          // Form submission logic
      } else {
          // Form display logic
      }
      

    Инструменты


    • amphp/amp 2.0.0 — Мощный асинхронный фреймворк с лаконичным интерфейсом благодаря генераторам. Также доступен ряд дополнительных компонентов: асинхронные mysql и postgres клиенты, DNS-резолвер, HTTP/WebSocket сервер, и другие.
    • wapmorgan/ServerAvailabilityMonitor — Утилита мониторит серверы на доступность и присылает отчеты об ошибках на почту. Поддерживает http, mysql, pgsql, memcache и redis. Прислал wapmorgan.
    • paragonie/sapient — Библиотека для обеспечения безопасности API, даже когда TLS сломан. Пост в поддержку.
    • genkgo/mail — Библиотека для отправки почты. Годная альтернатива PHPMailer или Swift Mailer.
    • prooph/event-store — EventStore на PHP 7.1 для реализации паттерна Event Sourcing.
    • jonathantorres/construct — Инструмент генерирует структуру папок и файлы для нового PHP-проекта.
    • wikimedia/composer-merge-plugin — Плагин для Composer, который объединяет несколько composer.json файлов налету. Удобно для разделения проекта на внутренние компоненты со своими зависимостями.

    Материалы для обучения



    Спасибо за внимание!

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

    Прислать ссылку
    Быстрый поиск по всем дайджестам
    Предыдущий выпуск: PHP-Дайджест № 110

    Only registered users can participate in poll. Log in, please.

    Стоит ли добавить функциональность retry в PHP?

    Zfort Group
    112.44
    Company
    Share post

    Comments 18

      –8

      Зачем нужна унарная версия оператора '??',


      $_POST["action"]?? === "submit"

      когда есть оператор '@'?


      @$_POST["action"] === "submit"
        +4

        Оператор '??' более быстрый, потому что не приводит к генерации ошибок.

          +3
          Сам спросил — сам ответил?)
          –4

          Почему-то у некоторых сильно бомбит когда они видят @ не зависимо от контекста.
          Сам уже давно использую @ для подобных целей, недавно с переходом на PHP 7+ заменил в некоторых местах на ??, в остальных осталось.


          На самом деле есть некоторые преимущества у ?? — он работает только с несуществующими элементами массивов/свойствами объектов, не скрывая ошибок, которые могут при этом возникать. Не то чтобы это было большой проблемой для меня, но всё же ?? будет более чистым способом достичь того же результата.

            +2
            Оператор @ это антипаттерн, он всего лишь подавляет вывод ошибок. Если вам нужен оператор @ вы что-то не так делаете.

              0

              Да ладно? А как удалить файл без использования "собачки" не подвергая код рейс-кондишн ошибкам? Есть идеи?


              if (is_file($some) && !@unlink($some)) {
                  throw new \RuntimException('Can not delete file ' . $some);
              }
                +3

                Легко:


                try {
                   unlink($some);
                } catch (\ErrorException $e) {
                   // а вот тут бы пригодился предлагаемый retry ;)
                }

                Что-что, у вас php errors все еще не завернуты в исключения? Ау, бросайте каменный топор уже, мамонты вымерли!

                  0

                  Такой код будет работать только в 7.0+, может быть к счастью. В 5.6 и ниже — исключение бросается в месте декларации set_error_handler.

                    0

                    P.S. тогда уж вот так:


                    try {
                        is_file($some) && unlink($some);
                    } catch (\ErrorException $e) {
                       throw new \RuntimException('Can not delete file ' . $some);
                    }

                    А в целом, согласен, что-то я не подумал =)

                    0
                    <?php
                    
                    set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
                        // error was suppressed with the @-operator
                        if (0 === error_reporting()) {
                            return false;
                        }
                    
                        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
                    });
                    
                    try {
                        unlink('nofile');
                    } catch(ErrorException $e) {
                        var_dump($e);
                    }
              +6
              retry стремный с точки зрения программиста (какой-то goto), но от бизнеса реально приходят требования, сделать несколько попыток какого-то проблемного действия (работа со сторонними нестабильными сервисами, например).
              retry просто решает такую задачу.
                +1

                неконсистентный синтаксис. думаю, не примут.

                  0
                  Неконсистентный синтаксис в PHP?) Я вас прошу) Это же самый больной язык в этом плане
                    +6

                    именно поэтому и не примут. все легаси выгребают.

                  +3

                  Все сторонние сервисы нужно считать нестабильными, если к ним стучишься через интернет.
                  Сам использую вот этот retry. Но там нельзя указать тип исключения, как в данном RFC.

                    0
                    Никто ведь не запрещает чуть расширить данное решение? Вот пример написанный буквально за 15 минут http://sandbox.onlinephpfunctions.com/code/4457a255223403c23af0b9e734510e4ff6ea444b
                    Причем без злосчастного goto.
                      +1

                      Пара советов:


                      1. GET запросы к сторонним сервисам лучше кешировать у себя и обновлять кеш по крону, а не по запросу от пользователя.
                      2. POST запросу лучше повторять с некоторым временным интервалом, чтоб не досить чужой сервис. А еще лучше их ставить в очередь на обработку, и в случае ошибки, повторно закидывать в очередь.
                      0
                      То есть рубям можно, а похапэ нельзя? При том, что в PHP синтаксис предполагается более гибкий.
                      Между прочим, во многих языках не хватает…

                    Only users with full accounts can post comments. Log in, please.