Генератор QR-кодов на PHP: 5 форматов без зависимостей
QR-код выглядит решённой задачей, пока не понадобится сто тысяч кодов для печатных этикеток. Тогда обёртка над библиотекой на JavaScript требует Node на сервере или отправляет данные третьей стороне. Генератор QR-кодов на PHP, который работает в запросе и не тянет зависимостей, снимает и то и другое.
Код: phpQRcode, лицензия MIT.
composer require globus-studio/phpqrcode, PHP от 7.4 до 9.0, и одна строка на изображение.
Один вызов, пять выходов
QRCode::svg('https://example.com');
SVG по умолчанию, потому что он печатается. Код на этикетке, визитке или плакате уходит в печать, а SVG масштабируется без решения о пикселях. png(), html(), string() и matrix() закрывают остальное: письмо, шаблон на таблицах, терминал и код, которому нужна голая сетка.
Последний формат важнее, чем кажется. Матрица нужна дизайнерскому инструменту, генератору PDF или canvas, а большинство библиотек держат её закрытой.
Уровень коррекции это деловое решение
Четыре уровня: L около 7% восстановления, M 15%, Q 25%, H 30%. Код на кузове машины, снятый под дождём, требует H. Код на экране требует L и остаётся маленьким.
Библиотека отдаёт уровень как enum, поэтому выбор виден в коде, а не спрятан в умолчании.
Маска это переключатель скорости
По умолчанию кодировщик перебирает восемь шаблонов маски и берёт лучший, а это около 180 миллисекунд на код. Передайте фиксированную mask от 0 до 7, и время падает до примерно 11 миллисекунд, в семнадцать раз.
Для одного счёта это неважно. Для партии в пятьдесят тысяч этикеток это разница между работой, которая закончилась, и работой, которая идёт к обеду. Обмен такой: чуть менее оптимальный узор, до которого сканеру нет дела.
Откуда числа
186 тестов, 2209 утверждений, покрытие около 100%, PHPStan максимального уровня и поддержка PHP с 7.4 по 9.0.
Диапазон версий это то, что чувствует клиент. Генератор, которому нужен PHP 8.2, заставляет обновлять сервер с десятью другими сайтами, а обновление на общем хостинге это проект, а не задача.
Почему без зависимостей
Кодировщик это арифметика и матрица. ext-gd нужен только для PNG, остальные рендереры на чистом PHP.
Для аудита безопасности это одна цепочка поставок меньше, для переезда на другой хостинг одно расширение меньше. Тот же довод в остальных моих инструментах, и это не скромность: библиотека QR-кодов достаточно мала, чтобы держать её своей.
Проверить это просто: composer show покажет один пакет, и на этом список заканчивается.
Где это окупается
Три задачи повторяются в клиентских проектах: счёт с кодом оплаты, складская этикетка с кодом товара и билет с кодом на входе. Каждой нужен код внутри существующей страницы или PDF, и каждая ломается, когда единственный способ его получить это сторонний сервис картинок.
Библиотека в запросе означает, что код рождается там, где уже лежат данные. Ни ключа API, ни лимита запросов, ни адреса картинки, который отвалится, когда сервис поменяет условия.
Отдельно стоит сказать про печать: SVG отдаёт типографию векторно, и код на этикетке остаётся резким при любом размере, а PNG на сто двадцать точек на дюйм превращается в кашу уже на пяти сантиметрах.
Чего она не делает
Она не читает QR-коды, не рисует логотип внутри кода и не решает, что положить в данные. Логотип в середине съедает коррекцию, а уровень, который выбрали для мокрой машины, логотип как раз и расходует.
Проверку кода на телефоне делает человек, и это единственный настоящий тест перед печатью тиража.
Рядом: разработка плагинов WordPress о том, куда генератор обычно встраивают, и разработка на PHP о том, как небольшая библиотека меняет смету.
