Особенности работы с 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 сломана. Хотя может плохо смотрел..

PostgreSQL: имя таблицы как параметр функции

Штатно в PostgreSQL я не нашел способа передавать имя таблицы как переменная у функции. Однако есть возможность это обойти. Например так:

CREATE OR REPLACE FUNCTION public.SetReceived(busname varchar ,idr integer)
	RETURNS boolean
	LANGUAGE plpgsql
AS $function$
	BEGIN
		EXECUTE format(concat('update ',busname,' set received=true where id=',idr));		
		return true;
	END;
$function$

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

Задача: вывести счетчик посещений определенной 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 3 4 5 6 7 310