Как в CentOs (Linux) заархивировать директорию

Работа с архивами — практически ежедневная задача при работе под любой операционной системой. В CentOS и других Linux-системах это создать архив удобнее всего с помощью команды: tar -cvzf folder.tar.gz folder В процессе исполнения будет выводиться лог с обработанными файлами, что весьма удобно для отслеживания процесса архивации. Извлечение файлов можно произвести Read more

Как в PHP получить имя класса без неймспейса

Если вы любите баловаться с наследованием классов, то рано или поздно сталкиваетесь с задачей когда нужно узнать имя класса в контексте которого выполняется тот или иной код. Однако, стандартные методы по типу использования магической константы __CLASS__ или get_class($this) возвращают имя класса с его полным неймспейсом. Т.е. вы хотите получить LockHandler, но получаете Component\Filesystem\LockHandler. Естественно, неокрепшему уму придёт сразу мысль: разбить строку на фрагменты разделённые символом «\» и взять последний фрагмент. Однако, это не самое лучшее решение. Существует ещё одно более простое, быстрое и нативное решение: использование рефлексии! (далее…)

Как на PHP перебрать все комбинации значений нескольких массивов

Достаточно интересная и не самая редкая задача. Допустим, есть несколько массивов с разными значениями, например: массив городов, возрастов, полов и т.п. Нужно вызвать некую функцию передав ей в качестве аргументов все возможные комбинации значений городов + возрастов + полов. Фактически это задача циклической итерации всех значений всех массивов. Неискушённый программист наверняка бы решил эту задачу с помощью вложенных циклов:

foreach($city as $_city) {
    foreach($age as $_age) {
        foreach($gender as $_gender) {
            $response = request($_city, $_age, $_gender);
        }
    }
}
Неплохо. Однако, такое решение не гибкое и максимально грустное. При увеличении количества перебираемых  массивов код будет становиться всё ужаснее, а также будет усложняться его поддержка и отладка. Привожу, возможно не самое красивое и не самое гибкое решение, что называется в лоб. Присылайте в комменты свои варианты либо ссылки на более хорошие, интересные и универсальные решения. (далее…)

Удивительные трюки с foreach в PHP

С версии PHP 5.5 появилась очень интересная фича: распаковка вложенных массивов с помощью list(). Дословно на русском описание этой фичи звучит как возможность обхода массива массивов с распаковкой вложенного массива в переменные цикла, передав list() в качестве значения. Что всё это значит? Оказывается больше не нужно писать так:

foreach($users as $user) {
    list($name, $password, $id) = $user;
    ...
}
(далее…)

Как в Nginx запретить отвечать на любой домен

У веб-сервера Nginx есть один фатальный недостаток — он пытается ответить на любой входящий запрос. Причём он отвечает даже на те запросы, в host-заголовке которых указан домен, который не был сконфигурирован! В этом случае Nginx выбирает первую попавшуюся секцию server и отдаёт ей запрос, даже если внутри этой секции значения директив server_name не соответствуют значению host-заголовка запроса. Такое поведение может приводить к путанице и неразберихе. Поэтому достаточно часто возникает задача — разрешить nginx отвечать только на те запросы, для которых был сконфигурирован server_name. (далее…)

Как в 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 оказался не причём. (далее…)