Перейти к содержимому

Генератор QR-кодов на PHP: 5 форматов без зависимостей

Генератор 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 о том, как небольшая библиотека меняет смету.