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