Как в Symfony 3.4 заменить стандартное сообщение об ошибке

Возникла задача — заменить стандартное сообщение об ошибке на что-то более дружелюбное и понятное для пользователя. Например, если для текущего URI не определён роутинг — то выводить json:

{"status":"error","message":"Unknown endpoint."}
Вместо этого кирпичного безумия: Решить эту задачу можно с помощью определения собственного обработчика событий. (далее…)

Как обновить библиотеки в файле composer.json до актуальных версий

Бывают такие ситуации, когда нужно внести правки в какой-либо проект, в который никто не заглядывал уже полгода-год. И конечно же большая часть библиотек в таких проектах уже не самых последних версий. И по закону подлости часть библиотек за это время успевает зарелизить новые мажорные версии, у которых в зависимостях также сменились мажорные версии. И так каскадом нужно обновить практически все зависимости в проекте. Так что простой composer update тут не поможет, т.к. Это особо актуально для проектов в которых используются клиентские библиотеки к сторонним сервисам, которое периодически меняют своё API и без обновления этих библиотек проект превращается в бессмысленную кучу неработающего кода. (далее…)

Как в Windows PowerShell посчитать количество строк в файле аналогично wc в Linux

К сожалению, виндовая консоль не имеет того набора команд, что и Linux. Поэтому некоторые элементарные задачи доставляют много баттхёрта. Например, банальная задача посчитать количество строк в файле в CentOS решалась бы такой командой:

cat file.log | wc -l
Или ещё проще:
wc -l file.log
Для Windows PowerShell рецепт будет такой:
cat file.log | measure-object -line
(далее…)

Warning: imap_headerinfo(): Bad message number в PHP при работе с IMAP

В PHP есть несколько десятков функций объединённых в один модуль для работы с почтовыми серверами по протоколу IMAP. Но сделаны они весьма ужасно. Ещё бы, ведь они появились ещё в PHP 4 и содержат в себе все самые худшие практики архитектуры и дизайна которые только можно было придумать. Одной из проблем является то, что эта библиотека оперирует двумя видами идентификаторов писем: в одном случае это $msg_number, а в другом — $uid. Причём, какого либо внятного объяснений различий в официальной документации не приводится. $uid — UID сообщения в ящике, а $msg_number — номер сообщения, это всё, что есть в документации. Но в чём же между ними разница? Зачем нужны два вида идентификаторов? Непонятно. Возможно, нужно изучать спецификацию IMAP протокола для получения просветления. В результате чего может возникать путаница, когда вместо $msg_number функции был передан $uid, в лучшем случае вы получите ошибку:

Warning: imap_headerinfo(): Bad message number
А в худшем случае — вы получите содержимое другого письма, задеплоите это в продакшен и узнаете об ошибке когда случится что-то нехорошее! (далее…)

Почему на сервере Hetzner медленно работает диск

Заметил внезапное снижение производительности на одном из CentOS 7 серверов и не менее внезапное появление ошибок 502 Bad Gateway, которых даже во время хорошей нагрузки ни разу не было, а тут ночью во время простоя вдруг начали валить. Первым делом стал смотреть вывод iostat -x 3:

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 58.00 8.33 1614.33 0.33 107477.33 34.67 133.17 4.32 2.63 2.63 33.00 0.35 56.80
sda 79.33 8.33 1600.00 0.00 108074.67 0.00 135.09 29.38 18.14 18.14 0.00 0.62 100.00
md2 0.00 0.00 0.00 8.67 0.00 34.67 8.00 0.00 0.00 0.00 0.00 0.00 0.00
md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
md1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
md3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Кто-то со страшной силой читает данные с диска со скоростью 100+ Мб/с, как видно, значение столбца rkB/s 107477.33 и 108074.67 для каждого из дисков в софт-рейде. Первым делом стал грешить на Docker, мало ли что происходит в одном из сотни контейнеров. Вполне мог задеплоиться кривой или дырявый релиз софта, однако Docker оказался не причём. (далее…)

Как установить ping в docker-контейнер?

Может случиться так, что при попытки что-нибудь попинговать изнутри docker-контейнера появиться пренеприятнейшая ошибка:

bash: ping: command not found
Как известно, docker-образы собираются как можно более минималистичными, чтобы не занимать место ненужными командами. Однако, при необходимости всё можно доставить поверх образа. (далее…)

Как в PHPStorm сгенерировать сигнатуры методов для интерфейса?

Достаточно злободневная тема. Допустим, у вас есть некий интерфейс и вам нужно его реализовать. В идеале хотелось бы сгенерировать новый класс который бы содержал все сигнатуры и определения. Но нет. Чтобы провернуть это в PHPStorm потребуется вручную создать новый класс и объявить ему implements AnyInterface. Теперь жмёт Alt + Insert, или в контекстном меню редактора выбираем пункт «Generate...», затем «Implement Methods...», либо сразу нажимайте Control + I. (далее…)

Как на PHP получить timestamp с точностью до наносекунд?

На чистом PHP данная задача не реализуема, но есть небольшой лайфхак:

$nanotime = system('date +%s%N');
В результате $nanotime будет содержать значение: 1523648935928101682, где 1523648935 это привычный всем timestamp, а часть 928101682 собственно наносекунды. (далее…)

Как в nano перейти на указанную строку в файле

Способ первый, если файл ещё не открыт, то можно указать строку через аргумент +N, uде N — нудная строка: nano +10 file.php Второй способ для перехода на нужную строку прямо в редакторе nano. Нажмите сочетание клавиш Ctrl + «_», на что будет задан вопрос: Enter line number, column number: Вводите нужный Read more