Как регистрировать и тестировать shutdown функции

  Рет қаралды 4,630

PHP Point

PHP Point

Күн бұрын

Валентин Удальцов про деструкторы, регистрацию и тестирование shutdown функций, а также различные нюансы вокруг замыканий и уборки мусора в PHP.
Код на GitHub: github.com/php....
Подписывайтесь на наши каналы в Telegram:
• Пых t.me/phpyh,
• PHP Digest t.me/phpdigest,
• PHP умирает?! t.me/isPHPdying.

Пікірлер: 66
@PHPPoint
@PHPPoint 3 жыл бұрын
В ходе обсуждения в комментариях под видео выяснили несколько полезных нюансов. • Подпроцесс удобнее всего оформить в отдельном файле. Тогда и автокомплит будет работать, и тест не будет перегружен. Рабочую директорию процесса можно передать вторым аргументом PhpProcess, а путь к временному файлу как переменную среды через третий аргумент. Спасибо Дмитрий Алексеев за наводку. • Можно по-разному определять unit тесты. Но теперь я склоняюсь к тому, что TemporaryFileResourceTest - интеграционный, так как взаимодействует с файловой системой. Спасибо Дмитрий Алексеев за наводку. • Совершенно необязательно делать метод delete() публичным, так как любое замыкание, объявленное в рамках класса, получает его область видимости. Спасибо Eugene Leonovich за Pull Request. Все эти изменения отражены в репозитории github.com/phppoint/how-to-register-and-test-shutdown-functions.
@5minphp
@5minphp 3 жыл бұрын
Статическое замыкание deleter - это бомба! (В смысле классный ход)
@ВикторТкаченко-ъ3з
@ВикторТкаченко-ъ3з 3 жыл бұрын
Лучше использовать, что то более эпичное - liquidator или eraser (отсылка к фильму с Арни) )
@ВалентинДубков-о7г
@ВалентинДубков-о7г 3 жыл бұрын
Спасибо, как всегда отличный контент и его подача. Хотелось бы увидеть еще больше различных фишечек и нюансов.
@andreychiglintcew5024
@andreychiglintcew5024 3 жыл бұрын
Пушка! Спасибо за труд!
@rkgrachel
@rkgrachel 3 жыл бұрын
Я человек простой, вижу Валентина - ставлю лайк. PS. С бородой был посолиднее )
@AlexanderBegoon
@AlexanderBegoon 3 жыл бұрын
Я человек простой, вижу Валентина - пишу псалом.
@floor12evgen
@floor12evgen 3 жыл бұрын
Отличный видос, как всегда. Хотелось бы попросить Валентина рассказать про фишки, проблемы и особенности работы пхп в контексте распределенных систем, где более одного воркера одновременно и потребляют очередь, и что-то читают-пишут в базу, что-то пушат в очередь и тд. Уверен, у Валентина опыт есть такой. Там есть о чем подумать и о чем поговорить.
@ДмитрийАлексеев-п2п
@ДмитрийАлексеев-п2п 3 жыл бұрын
Можно отказаться от sprintf положив код в PHP файл и забирая его содержимое через file_get_contents(). И подстветка будет работать и автокомплит и все остальное что умеет шторм.
@vudaltsov
@vudaltsov 3 жыл бұрын
Да, отличная альтернатива, спасибо)
@vudaltsov
@vudaltsov 3 жыл бұрын
Единственное, путь до временного файла всё равно придётся чем-то подставить.
@sergeyit10
@sergeyit10 3 жыл бұрын
Не думаю, что самое лучшее решение, так как юнит тест должен быть «чистым», т.е. не взаимодействовать с окружением(читать или писать файл, ходить в БД). В данном случае очень хорошее решение использовать sprintf, а с подсветкой синтаксиса со временем может что-то подкрутят ребята из jetBrains в PHPStorm
@ДмитрийАлексеев-п2п
@ДмитрийАлексеев-п2п 3 жыл бұрын
@@sergeyit10 т.е. то что юнит тесты создают временные файлы и проверяют их наличие тебя не смутило? :)
@vudaltsov
@vudaltsov 3 жыл бұрын
@@ДмитрийАлексеев-п2п , короче я запушил в репо твоё решение через отдельный PHP-файл с одной подстановкой $file.
@КарлЛьвович-д8э
@КарлЛьвович-д8э 3 жыл бұрын
Спасибо, что делитесь полезными знаниями!
@kuaukutsu
@kuaukutsu 3 жыл бұрын
Сжато, всё по делу, информативно. Спасибо!
@sovrinfo
@sovrinfo 2 жыл бұрын
Спасибо за видео. Коммент в поддержку!
@metp94able
@metp94able 3 жыл бұрын
Очень полезно! Спасибо!
@sergeyit10
@sergeyit10 3 жыл бұрын
Очень круто, спасибо! Про WeakReferance не знал. Буду использовать. Спасибо!
@eugeneleonovich6085
@eugeneleonovich6085 3 жыл бұрын
Создавать дополнительное замыкание $deleter вовсе не обязательно, $weekThis->get() будет иметь доступ к приватным методам, то есть достаточно поменять public на private в сигнатуре метода delete(). И еще одно замечание, перед проверкой на отсутсвие файла в тестах, я бы добавил проверку на наличие файла после вызова createTempFile(), а то мало ли, вдруг место на диске кончилось или прав оказалось недостаточно.
@nick7chasniy380
@nick7chasniy380 3 жыл бұрын
Вроде все просто, но так изящно! Валентин, спасибо!
@ev_geniy17
@ev_geniy17 3 жыл бұрын
Спасибо, большое за контент, побольше бы таких уроков .
@vladd3557
@vladd3557 3 жыл бұрын
Спасибо, познавательно
@drugou5414
@drugou5414 3 жыл бұрын
Это видео просто пушка) Спасибо большое)
@hipot
@hipot 2 жыл бұрын
спасибо, очень полезное видео!
@den-rad
@den-rad 3 жыл бұрын
Спасибо, очень познавательно.
@sufir
@sufir 3 жыл бұрын
Как замокать финальные классы?
@yankeedudlizz
@yankeedudlizz 3 жыл бұрын
например мокать интерфейс, который имплементируют финальные классы
@vudaltsov
@vudaltsov 3 жыл бұрын
В целом мы вообще почти перестали мокать. Только тривиальные интерфейсы с простым поведением. Используем классический подход, когда при тестировании используются реальные классы или InMemory реализации, если речь про репозитории. Про это можно прочитать длинную статью Фаулера Mocks Aren't Stubs
@illia4503
@illia4503 3 жыл бұрын
Ща они тебя тут научат создавать на каждый класс по интерфейсу чтобы мокать))) . Те кто пишет про то, чтобы всюду пихать интерфейсы явно не слышали про про принцип Low Coupling, High Cohesion, а тех кто делает финальными все классы похоже входил в айти через курсы и не знает 3 главных принципов ООП.
@alexbursak
@alexbursak 3 жыл бұрын
Отличное видео, спасибо!
@AleksandrGolouz
@AleksandrGolouz 3 жыл бұрын
Можете пояснить один момент. Вы избавляетесь от метода delete потому, что он светится наружу или для более красивого кода? Если из за того, что он светится наружу, то почему бы его не сделать приватным?
@ElisDN
@ElisDN 3 жыл бұрын
Приватный метод не получится передать в register_shutdown.
@AleksandrGolouz
@AleksandrGolouz 3 жыл бұрын
@@ElisDN Точно, забыл про такую особенность. Спасибо за пояснение
@eugeneleonovich6085
@eugeneleonovich6085 3 жыл бұрын
@@ElisDN У меня возник такой же вопрос - kzbin.info/www/bejne/a5ayeaqrl9qenbs&lc=Ugy_Y_-L_KJfze6_9Wd4AaABAg. И я, честно говоря, не вижу причины почему не получится вызвать приватный метод - 3v4l.org/PidBa.
@ElisDN
@ElisDN 3 жыл бұрын
@@eugeneleonovich6085 Так, как у вас получится. А как у меня не получится.
@belamov
@belamov 3 жыл бұрын
класс, спасибо большое, очень познавательно!)
@borisoffdenis
@borisoffdenis 3 жыл бұрын
подскажите пожалуйста, где можно почитать про то что, классы должны быть либо абстрактными, либо финальными.
@PHPPoint
@PHPPoint 3 жыл бұрын
Ocramius, When to declare classes final
@borisoffdenis
@borisoffdenis 3 жыл бұрын
@@PHPPoint спасибо
@romankrut7038
@romankrut7038 3 жыл бұрын
@@PHPPoint С удовольствием бы попробовал это на проекте где работаю, но у нас Magento 2 где генерируються Interceptor`s, sad story
@mamontovdima
@mamontovdima 3 жыл бұрын
Спасибо, было интересно!
@shyrops
@shyrops 3 жыл бұрын
Спасибо, было очень интересно)
@k-samuel
@k-samuel 3 жыл бұрын
Как быть с замечанием из документации: "Деструкторы, вызываемые при завершении скрипта, вызываются после отправки HTTP-заголовков. Рабочая директория во время фазы завершения скрипта может отличаться в некоторых SAPI (например, в Apache)" Выходит удаление файла в деструкторе опасно если не указан полный путь к файлу, про это вроде бы нет в ролике ? Там же в комментариях про утечки при циклических ссылках. Кажется сомнительным.
@PHPPoint
@PHPPoint 3 жыл бұрын
В целом видео вообще не про это, это уже нюансы примера, относящиеся к другому его аспекту. Но я бы в любом случае рекомендовал использовать абсолютные пути по возможности. В голом PHP это всегда можно сделать при помощи __DIR__, в Symfony через инъекцию параметра %kernel.project_dir%.
@k-samuel
@k-samuel 3 жыл бұрын
@@PHPPoint Все понимаю, пример не особо удачный. Использование деструктора тоже сомнительно, он может не вызваться при циклической ссылке. Можно наделать шатдаун функций, но не проще ли сразу зачищать за собой ресурсы и не полагаться на деструкторы в любом применении? Потом этот код кто нибудь поднимет на road runner или react php... и неожиданно огребет проблем
@PHPPoint
@PHPPoint 3 жыл бұрын
Данный код нормально будет работать в контексте роадраннера. TemporaryFileResource - это не сервис в DI, который перманентно находится в памяти долгоиграющего приложения, это скорее ValueObject, который утилизируется как только становится не нужен. Но в целом я согласен, что не стоит полагаться на деструктор как на основной механизм, скорее это бэкап. А уже shutdown function тем более бэкап ;)
@Varkatel
@Varkatel 3 жыл бұрын
странно, что нет unregister_shutdown_function потому что без него тут будет течь память
@АндрейРешетченко-т9й
@АндрейРешетченко-т9й 3 жыл бұрын
Помнится, году в 2к17м натыкался на такой то ли баг, то ли фичу, что register_shutdown_function не работает с fast-cgi, так как процесс не завершался, а брал в обработку новый запрос, и зарегистрированный каллбек тоже не вызывался, пока данный воркер не прекращал работу.
@den-rad
@den-rad 3 жыл бұрын
Даже в случае экстренного завершения по ошибке?
@АндрейРешетченко-т9й
@АндрейРешетченко-т9й 3 жыл бұрын
@@den-rad вот щас точно не скажу, умирает ли процесс воркера при экстренном завершении, тестировать нужно.
@EgorUshakov
@EgorUshakov 3 жыл бұрын
Первый раз вижу, что можно писать закрывающий идентификатор HERE/NOW-DOC не с первой позиции строки. Да и "не можно" это, ибо "The closing identifier **must** begin in the first column of the line." От этого и все дальнейшие беды с подчеркиванием штормом открывающего "
@vudaltsov
@vudaltsov 3 жыл бұрын
И PhpStorm это поддерживает. Просто он рассчитывает на код для eval, который не может начинаться с открывающего тега.
@vudaltsov
@vudaltsov 3 жыл бұрын
Ютуб порезал мой первый комментарий со ссылкой на доку. Короче, это в PHP 7.3 появилось, посмотри на официальном сайте migration guide.
@OlegM-nn4xx
@OlegM-nn4xx 3 жыл бұрын
Подскажи тему ide пожалуйста
@vudaltsov
@vudaltsov 3 жыл бұрын
Самая стандартная светлая 😄
@VitaliySunny
@VitaliySunny 3 жыл бұрын
Круто!
@illia4503
@illia4503 3 жыл бұрын
Интересно что в голове у людей которые все классы делают финальными? Зачем вы тогда пишите на ООП языках, если "наследование зло", фейспалм.
@PHPPoint
@PHPPoint 3 жыл бұрын
Ты слово наследование очень узко понимаешь. Наследование про типы, а не про классы.
@ГерманФедоров-е6ш
@ГерманФедоров-е6ш 3 жыл бұрын
А это плохо, если я хочу контент чуть проще? То есть я в принципе с натяжкой понимаю о чем идет речь, но не понимаю зачем это может быть мне полезно. Было бы круто ввести какой-то уровень грейдов для таких туториалов. Но может это я слабый, а все тут прекрасно все понимают
@pavelnemoi
@pavelnemoi 3 жыл бұрын
Спасибо, познавательно!
JIT в PHP 8: Просто о сложном
19:26
Andrey Lozunov - Fullstack Web Developer
Рет қаралды 14 М.
ВЛОГ ДИАНА В ТУРЦИИ
1:31:22
Lady Diana VLOG
Рет қаралды 1,2 МЛН
Жездуха 42-серия
29:26
Million Show
Рет қаралды 2,6 МЛН
Caleb Pressley Shows TSA How It’s Done
0:28
Barstool Sports
Рет қаралды 60 МЛН
IBM SkillsBuild || WCP || PAP || Masterclass 1
1:54:51
CSRBOX
Рет қаралды 1,2 М.
Сергей Протько "Солидный код"
29:23
PHP улучшаем производительность: настройки PHP-FPM
20:16
Андрей Шестаков
Рет қаралды 17 М.
ВЛОГ ДИАНА В ТУРЦИИ
1:31:22
Lady Diana VLOG
Рет қаралды 1,2 МЛН