Подборка свежих новостей и материалов из мира PHP.
Для PHP 8.2 предложили добавить тип
null
; опубликована уязвимость в PHP с disable_functions, которая на самом деле не уязвимость; новый сайт от сообщества — phpopendocs.com; PHP 8.1 RC 3, Xdebug 3.1 и другие релизы.Также в выпуске порция инструментов, полезные статьи, видео.
Приятного чтения!
Этот дайджест подготовлен совместно с Insolita. Если понравился выпуск, плюсаните пост, пожалуйста.
Новости
-
PHP 8.1.0 RC 3
Очередной релиз-кандидат доставлен по расписанию. Что нового будет в PHP 8.1 можно посмотреть в постах What's new in PHP 8.1 и PHP 8.1: before and after и на PHP.Watch.
Свежий пост от Brent Roose про использование оператораnew
для дефолтных значений параметров: PHP 8.1: new in initializers.
-
«Уязвимость» в PHP для обхода
disable_functions
Исследователь опубликовал метод обхода ограничений, заданных при помощи директивыdisable_functions
вphp.ini
.
С помощьюdisable_functions
можно запретить использование в PHP-скриптах функции, например, можно запретитьsystem
,exec
,proc_open
иshell_exec
для блокирования вызова внешних программ.
//eval()
, кстати, не получится запретить.
Уязвимостью эту проблему назвать нельзя, потому чтоdisable_functions
— это не секьюрити фича и полагаться на нее ради безопасности — плохая идея.
Напишите в комментариях, используете ли выdisable_functions
?
Цитата Никиты Попова на Reddit:Является ли что-то проблемой безопасности, зависит от вашей модели угрозы. Что касается проекта PHP, то наша модель угрозы — это удаленный злоумышленник. Мы считаем секьюрити проблемой случай, когда злоумышленник имеет возможность выполнить произвольный PHP-код на сервере (RCE).
Подробнее о том, что в PHP считается проблемой безопасности, а что нет: wiki.php.net/security.
А если интересно разобраться, то вот классный разбор того, как работаетdisable_functions
и как устроены подобные эксплоиты. И даже как можно автоматически искать подобные проблемы.
В тему разбор реальной RCE-уязвимости в fiveai/Cachet, популярном проекте на Laravel: Code Execution via Laravel Configuration Injection.
-
composer/composer 2.1.9
В обновлении исправлена уязвимость на Windows (CVE-2021-41116). Пользователям Windows обязательно стоит обновиться. -
PHPOpenDocs.com
Экспериментальный сайт для полуофициального контента по PHP.
Из полезного уже есть, страница для спонсорства со списком контрибьюторов сгруппированных по версиям PHP. А также раздел Internals с кучей ссылок про устройство кода PHP и как начать контрибьютить.
-
PHP Russia 2022
Уже известны даты для конференции — 6-7 июня. Начали подготовку и прием заявок на доклады!
PHP Internals
-
[RFC] Allow null as standalone type
Предлагается добавить возможность использоватьnull
в декларациях типов.
Во-первых, это недостающий кусок для полноты системы типов в PHP — естьmixed
, добавилиnever
, объединения и пересечения, не хватает юнит-типа.
Во-вторых, такой тип позволит покрыть некоторые граничные случаи и улучшить статический анализ.
Например, в объединениях можно использовать псевдотипfalse
, но нельзя указать, что функция возвращаетfalse|null
, толькоbool|null
.
-
[RFC] Deprecate partially supported callables
Этот RFC уже на голосовании и, судя по всему, пройдет в PHP 8.2. Подробнее про предложение читайте в PHP-Дайджесте № 211.
Инструменты
- Xdebug 3.1.0 — Обновился популярный отладчик для PHP. Добавлена поддержка PHP 8.1, много фиксов и несколько узкоспецифических фич.
-
php-runtime/runtime — Компонент Runtime отделяет логику загрузки приложения от глобального состояния, и таким образом позволяет запускать приложение в любых окружениях без изменений, например, на PHP-FPM, ReactPHP, Swoole и т.д.
Изначально это был компонент для Symfony, но получился настолько хорош, что авторы выделили его в отдельную организацию на Гитхабе. - rindow/rindow-neuralnetworks — Фреймворк для обучения нейронных сетей по мотивам Python Keras. Согласно документации поддержка GPU пока доступна в экспериментальном режиме и только под Windows.
- nunomaduro/termwind — Библиотека для форматирования вывода консольных программ с синтаксисом в стиле Tailwind CSS. PHP 8+
- termage/termage — Еще одна похожая библиотека для форматирования вывода в консоль.
- piko-framework/router — PHP-разработчики никогда не писали роутеры /s и вот один на базе сжатого префиксного дерева. Если верить бенчмаркам, то быстрее роутера Symfony.
- unitpay/shamir — Реализация схемы разделения секрета Шамира (Shamir's Secret Sharing). Прислал AlexGx.
- icanhazstring/random-issue-picker — Если хотите поучаствовать в Hacktoberfest, но не знаете с чего начать, то вот инструмент, который выберет случайную issue на гитхабе или гитлабе.
Symfony
Laravel
- sajya/server — JSON-RPC 2.0 API сервер для Laravel.
- Разделение кода и текста: первая рабочая версия
- Ресурсы для API в Laravel
- Laravel Worldwide Meetup #10: Немного про AWS Lambda, и про фреймворк для тестов Pest.
- Конвертирование тестов на чистом PHPUnit в Pest
- Пишем онлайн-магазин на Laravel — Серия стримов.
Статьи
- The Road to PHP: Static Analysis — Рассылка в 10 дней от Brent Roose про статический анализ.
- Шпаргалка по встроенным исключениям в PHP.
-
Процедуральное искусство (generative art) на PHP — Автор рассказывает, как можно генерировать картинки от простых аватарок до пиксельных городов:
- Игра на FFI: quasilyte/kphp-game
Ребятки из KPHP реализовали экспериментальную поддержку FFI, а в качестве демо возможностей сделали на нем небольшую игру.
Что примечательно, KPHP-FFI совместим с FFI из традиционного PHP, то есть игру можно запустить и на обычном PHP 7.4+.
Что-то подобное показывал SerafimArts на своих стримах про PHP + Vulcan.
Подробнее про FFI можно почитать тут.
Аудио/Видео
Подписывайтесь на Telegram-канал PHP Digest.
Этот дайджест подготовлен совместно с Insolita. Если понравился выпуск дайджеста, плюсаните пост, пожалуйста.
Кстати, Юля опубликовала заметку про выборку дней рождения в Postgres.
Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.
Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 212
Комментарии (12)
stalkerxxl
11.10.2021 15:25+9Остановитесь! Я не успеваю учить =)
DmitryKoterov
12.10.2021 07:57Что там учить-то, уже 5-10 лет назад все выучили в разных других языках. Я бы сказал, что PHP даже запаздывает с сахаром (где async-await? или ставка на файберы? - что, в принципе, интересный ход).
p4s5w0r9
12.10.2021 08:12где async-await? или ставка на файберы?
Ставка на файберы.
pronskiy Автор
12.10.2021 12:17+1Так одно другому не мешает. В смысле, это разные вещи. Файберы — это просто небольшое улучшение корутин.
А для async/await нужен асинхронный движок. В чем проблема делать сейчас на Amp/Swoole?
Gemorroj
12.10.2021 16:07Проблема в том, что как правило уже есть проект не на Amp/Swoole, но хочется внедрить для некоторых операций параллельщину. И вот тут начинаются проблемы с сериализацией. Т.к. огромное кол-во кода просто нельзя пропустить через тот же
amphp/parallel
, т.к. он не сериализуем (doctrine, symfony/http-client, ...).pronskiy Автор
12.10.2021 16:53+5Что-то все в кучу. Давайте разбираться.
асинхронность != параллельность
>хочется внедрить для некоторых операций параллельщину
Можно какой-нибудь конкретный пример из жизни? Попробуем разобраться.Синхронность/одноточность PHP — преимущество, которое очень упрощает код и отладку.
Вот допустим смержат https://github.com/swow/swow в ядро PHP. Что изменится для вашего проекта "не на Amp/Swoole"?Также, symfony/http-client — вполне поддерживает асинхронность https://symfony.com/doc/current/http_client.html#http-client-streaming-responses И вообще делать непблокирующие HTTP-вызовы — тривиальная задача, которую умели делать еще со времен curl multi.
Gemorroj
14.10.2021 10:01подробнее, например, тут https://github.com/amphp/ext-fiber/issues/9
пример неработающей связки amp и symfony/http-client - https://github.com/Gemorroj/parallel-nonserializable
SerafimArts
12.10.2021 15:53+4где async-await?
Блин, пхпшники уже совсем разленились (ирония)
function await(\Generator $coroutine): mixed { while ($coroutine->valid()) { $current = $coroutine->current(); if ($current instanceof \Generator) { $current = await($current); } $coroutine->send($current); } return $coroutine->getReturn(); }
Для файберов примерно тоже самое будет, только ещё шаг со
start
добавится.Так что всё что надо — это определиться с тем что именно будет считаться "единицей авейта". В питоне, например, это корутинки и есть.
SerafimArts
Стримы — это в основном болтология. Не советовал кому-либо тратить время на просмотр их записей. Тем более они на середине обрываются (всего 2 серии), т.к. покопавишь в VK — понял, что эта штука требует дофига опыта, которого у меня просто нет, так что не могу гарантировать качество материала. В качестве альтернативы могу предложить более сжатый и щадащий вариант с введением в OpenGL на PHP: https://www.youtube.com/watch?v=1ZO1wR4rCCQ
Если же мы говорим про демку от Искандера, то она использует SDL. Если кратко, то это набор из функций-утилит для работы с окнами, событиями и 2d примитивами, которая в значительной степени облегчает работу с графикой и не требует глубоких познаний устройств видеокарты. Так что для знакомства с этим миром я бы рекомендовал начать именно с неё (с библиотеки SDL), а не лезть сразу в дебри из OpenGL и уж тем более (тьфу-тьфу) Vulkan.