Свежая подборка со ссылками на новости и материалы. В выпуске: 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

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

Проголосовало 348 человек. Воздержалось 47 человек.

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

Поделиться с друзьями
-->

Комментарии (18)


  1. Finesse
    26.06.2017 01:38
    -8

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


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

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


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


    1. Finesse
      26.06.2017 01:52
      +4

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


      1. kruslan
        26.06.2017 13:50
        +3

        Сам спросил — сам ответил?)


    1. nazarpc
      26.06.2017 01:57
      -4

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


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


      1. baldrs
        26.06.2017 15:54
        +2

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


        1. SerafimArts
          26.06.2017 19:20

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


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


          1. symbix
            26.06.2017 21:03
            +3

            Легко:


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

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


            1. SerafimArts
              27.06.2017 01:58

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


            1. SerafimArts
              27.06.2017 02:07

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


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

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


          1. Big_Shark
            27.06.2017 01:06

            <?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);
            }


  1. Gemorroj
    26.06.2017 02:20
    +6

    retry стремный с точки зрения программиста (какой-то goto), но от бизнеса реально приходят требования, сделать несколько попыток какого-то проблемного действия (работа со сторонними нестабильными сервисами, например).
    retry просто решает такую задачу.


    1. zelenin
      26.06.2017 03:17
      +1

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


      1. vlreshet
        26.06.2017 09:29

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


        1. zelenin
          26.06.2017 09:37
          +6

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


    1. Nicklasos
      26.06.2017 13:02
      +3

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


      1. DjSebas
        26.06.2017 17:00

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


      1. ghost404
        28.06.2017 20:55
        +1

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


        1. GET запросы к сторонним сервисам лучше кешировать у себя и обновлять кеш по крону, а не по запросу от пользователя.
        2. POST запросу лучше повторять с некоторым временным интервалом, чтоб не досить чужой сервис. А еще лучше их ставить в очередь на обработку, и в случае ошибки, повторно закидывать в очередь.


    1. a-tk
      26.06.2017 14:24

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