Особенности работы с DOMDocument в php 7 и 8

Разрабатывал давече один скрипт по работе с XML, на рабочем ПК, установленным php 8.2, и был весьма удивлён, что код вида:

$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->loadXML($this->xml_req);
$root = $dom->documentElement;
$root->getElementsByTagName('Signature')->item(0)->remove();

Отлично работает на PHP 8 и не работает на PHP 7. , ругаясь на

Call to undefined method DOMNodeList::remove()

Странно подумал я, почесав затылок. Пришлось переписать код на вида:

        $dom = new DOMDocument('1.0', 'utf-8'); 
        $dom->loadXML($xml_req_template);
        $root = $dom->documentElement;
        
        $parents=$root->getElementsByTagName('Signature');        
        for ($i = $parents->length - 1; $i >= 0; $i--) {
            $parent=$parents->item($i);
            if ($parent && $parent->parentNode) {
                $parent->parentNode->removeChild($parent);
            }
        }

И нигде ведь не попадалось в документации по работе с PHP, что совместимость с php7 сломана. Хотя может плохо смотрел..

Подсчет количества открытий страницы в минуту

Задача: вывести счетчик посещений определенной web страницы в минуту.

Решение: простой способ «в лоб» — парсить логи apache

#!/bin/bash
cat /var/log/httpd/access_log | grep $(date --date '-1 min' '+%R') | grep invoice -c >/var/www/html/cnt.txt

Чистый код<>Понятный код

По мотивам время от времени попадающихся мануалов «как писать чистый код». Ну не об этом все авторы думают в большинстве своём. Не поддерживали они легаси 20-ти летней давности, не разбирали код который написал условный Вася, который уже 15 лет как покинул эту компанию. Код в первую очередь должен быть понятным. А читаемым? Да пофиг. Любой код должен разобрать понять и исправить любой выпускник ПТУ. Вот к чему нужно стремиться. А как этого достичь? Да достаточно просто:

  1. Каждая процедура-функция должна быть прокомментирована «зачем она и что делает». Что принимает на вход, и то выдает на выходе. Длинных функций следует избегать.
  2. Переменные, имена функций и процедур должны говорить сами за себя
  3. Не используйте «сахар» в коде (легализованные языком сокращения кода). Пусть будет больше конструкций, зато человек не погруженный в язык, и не знающий его особенности быстро его поймёт.
  4. Если нет борьбы за производительность, то лучше написать медленный но понятный код, используя простые алгоритмы а не сложные.
  5. Используйте систему хранения версий на подобии GIT. Так можно будет потом отследить кто чего менял, а если будут прокомментированные коммиты, то и зачем.
  6. Если используете фремворки — то используйте их без фанатизма, чтобы однажды не оказалось что какой то его компонент (а то и сам фремворк) вдруг не стал тыквой. Это для долгосрочных проектов.

Пакетное сжатие файлов JPG

Задача: сжать файлы формата JPG во всех встречающихся папках.

Решение: воспользуемся утилитой jpegoptim совместно с find:

find . -name "*.jpg" | xargs jpegoptim -f -m 70

1С: Запрет запуска дубля регламентного задания

Иногда бывает что регламентное задание нужно запускать как можно чаще, но вот в чём дело: при запуске есть вероятность что предыдущее задание еще не завершено. В результате они как матрешка будут всё расти и расти…ну и наверное в конце концов будет какой-то коллапс.

Решение: да простое. Просто перед запуском задания, убедимся что предыдущая копия уже отработала. Во первых, нужно у регламентного задания прописать ключ. А во вторых, непосредственно перед запуском объемной части задания, нужно проверять фоновые задания, и если задание с таким ключём в списке активных…то ничего далее не делать:

Функция ОтправитьДанныеИзПланаОбменаРегламентно()
	// проверим, а вдруг еще не завершено предыдущее регламентное задание?
	Фоновые = ФоновыеЗадания.ПолучитьФоновыеЗадания();    
    Для Каждого Фоновое из Фоновые Цикл        
        Если Найти(Фоновое.Ключ, "отправка_данных_шины") > 0 И Фоновое.Состояние = СостояниеФоновогоЗадания.Активно Тогда            
            Возврат 0;            
        КонецЕсли;                        
    КонецЦикла;	
...
КонецФункции
1 3 4 5 6 7 300