Перейти до вмісту

Генератор 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 про те, як невелика бібліотека змінює кошторис.