PHPでQRコードを生成する場合は、ComposerでQRコード生成ライブラリを導入する方法が一般的です。
QRコードの仕様をPHPだけで一から実装することも可能ですが、誤り訂正、データ配置、マスク処理、画像出力など多くの処理が必要になります。
そのため、通常のWeb開発では既存のライブラリを利用したほうが効率的です。
PHP向けの代表的なQRコード生成ライブラリには、endroid/qr-codeやchillerlan/php-qrcodeがあります。
この記事では、PHPでQRコードを生成する基本的な方法から、画像の保存、ブラウザへの直接出力、動的QRコードの仕組みまで詳しく解説します。
PHPでQRコードを生成する主な方法
PHPでQRコードを生成する方法には、主に次の選択肢があります。
- ComposerでQRコード生成ライブラリを導入する
- 外部のQRコード生成APIを利用する
- QRコード生成処理を自作する
一般的なPHPアプリケーションでは、Composerで管理できるライブラリを利用する方法が扱いやすいでしょう。
外部APIを利用する方法もありますが、通信障害、API料金、レート制限、サービス終了、送信データのプライバシーなどを考慮する必要があります。
単純にPHP内でQRコードを生成するだけであれば、外部サービスに依存しないライブラリ方式が適しています。
endroid/qr-codeを使ってQRコードを生成する
endroid/qr-codeは、PHPでQRコードを生成できるライブラリです。
PNGやWebPなどの画像形式だけでなく、SVGやEPSなど複数の形式で出力できます。
URLや任意の文字列などをQRコード化できるため、WebサイトやWebアプリケーションにも組み込みやすいライブラリです。
Composerでendroid/qr-codeをインストールする
プロジェクトのディレクトリで、次のコマンドを実行します。
composer require endroid/qr-code
インストールすると、Composerによってvendorディレクトリやオートローダーが作成されます。
PHPからライブラリを利用するときは、通常次のようにautoload.phpを読み込みます。
require __DIR__ . '/vendor/autoload.php';
PNGを生成する場合はGD拡張を確認する
PNGやWebPなどの画像形式でQRコードを生成する場合は、PHPのGD拡張が利用できる環境か確認しておきましょう。
GD拡張が有効かどうかは、次のコマンドで確認できます。
php -m | grep gd
PHPコードから確認する場合は、次のように記述できます。
<?php
var_dump(extension_loaded('gd'));
trueが表示されればGD拡張が読み込まれています。
PHPで基本的なQRコードを生成する
endroid/qr-codeをインストールしたら、PHPからQRコードを生成できます。
たとえば、https://example.comというURLをQRコード化してPNGファイルとして保存する場合は、次のように記述します。
<?php
require __DIR__ . '/vendor/autoload.php';
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
$qrCode = new QrCode(
data: 'https://example.com'
);
$writer = new PngWriter();
$result = $writer->write($qrCode);
$result->saveToFile(__DIR__ . '/qrcode.png');
実行すると、指定したディレクトリにqrcode.pngが生成されます。
スマートフォンなどで読み取れば、QRコードに設定したURLを取得できます。
QRコードのサイズや余白を指定する
QRコードのサイズや余白などを調整することもできます。
たとえば、次のように設定できます。
<?php
require __DIR__ . '/vendor/autoload.php';
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;
$qrCode = new QrCode(
data: 'https://example.com',
encoding: new Encoding('UTF-8'),
errorCorrectionLevel: ErrorCorrectionLevel::Low,
size: 300,
margin: 10,
roundBlockSizeMode: RoundBlockSizeMode::Margin
);
$writer = new PngWriter();
$result = $writer->write($qrCode);
$result->saveToFile(__DIR__ . '/qrcode.png');
sizeではQRコードの大きさ、marginでは周囲の余白を指定します。
ただし、ライブラリのAPIはバージョンによって変更されることがあります。
実際に使用するときは、Composerでインストールされたバージョンと一致する公式ドキュメントを確認してください。
PHPからQRコードをブラウザへ直接表示する
QRコードをファイルとして保存せず、PHPからブラウザへ直接返すこともできます。
たとえば、次のように記述します。
<?php
require __DIR__ . '/vendor/autoload.php';
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
$qrCode = new QrCode(
data: 'https://example.com'
);
$writer = new PngWriter();
$result = $writer->write($qrCode);
header('Content-Type: ' . $result->getMimeType());
echo $result->getString();
このPHPファイルをqrcode.phpとして公開した場合、HTMLから次のように読み込めます。
<img src="qrcode.php" alt="QRコード">
この方法なら、QRコード画像をサーバーへ毎回保存する必要がありません。
PHPで動的なQRコードを生成する
商品ページやイベントページなどでは、QRコードの内容を動的に変えたい場合があります。
たとえば、商品IDから商品ページのURLを生成する場合は、次のように記述できます。
<?php
$productId = 123;
$url = 'https://example.com/products/' . $productId;
生成したURLをQRコードのデータとして渡します。
$qrCode = new QrCode(
data: $url
);
商品IDが変われば、QRコードの内容も自動的に変わります。
たとえば、商品IDが123の場合は、
https://example.com/products/123
商品IDが456の場合は、
https://example.com/products/456
というURLをそれぞれQRコード化できます。
ECサイトの商品ページ、チケット発行、イベント受付などでも利用できます。
GETパラメータからQRコードを生成する
ユーザーが入力したURLや文字列からQRコードを生成することも可能です。
たとえば、次のようなURLを利用するとします。
qrcode.php?text=https%3A%2F%2Fexample.com
PHPでは次のように取得できます。
$text = $_GET['text'] ?? '';
取得した文字列をQRコードへ渡します。
$qrCode = new QrCode(
data: $text
);
ユーザー入力は必ずチェックする
公開されたQRコード生成機能でユーザー入力をそのまま利用するのは避けたほうがよいでしょう。
たとえば、最低限次のような入力チェックを行います。
<?php
$text = trim($_GET['text'] ?? '');
if ($text === '' || mb_strlen($text) > 1000) {
http_response_code(400);
exit('Invalid input');
}
文字数を制限しておけば、極端に大きなデータを入力されることによるサーバー負荷を抑えやすくなります。
また、入力内容をHTMLへ表示する場合は、XSS対策としてhtmlspecialchars()などを使用する必要があります。
URL以外の文字列もQRコードにできる
QRコードへ保存できるのはURLだけではありません。
任意の文字列をQRコード化できます。
$qrCode = new QrCode(
data: 'こんにちは'
);
用途によっては、次のような情報を格納できます。
- 電話番号
- メールアドレス
- 商品番号
- 会員ID
- Wi-Fi接続情報
- 連絡先情報
- 任意のテキスト
ただし、QRコードには格納できるデータ量に上限があります。
データ量が多くなるほどQRコードのパターンが細かくなり、印刷サイズや読み取り環境によってはスキャンしにくくなる場合があります。
QRコードの誤り訂正レベルとは
QRコードには、一部が汚れたり欠損したりしてもデータを復元できる誤り訂正機能があります。
一般的には、次の4種類のレベルがあります。
| レベル | 復元能力の目安 | 特徴 |
|---|---|---|
| L | 約7% | データ容量を確保しやすい |
| M | 約15% | 標準的 |
| Q | 約25% | 比較的高い復元能力 |
| H | 約30% | 4段階で最も高い |
誤り訂正レベルを高くすると、欠損への耐性は高まります。
一方で、同じデータ量でもQRコードが複雑になりやすくなるため、用途に応じて設定する必要があります。
なお、「HならQRコードの30%を自由に隠しても必ず読み取れる」という意味ではありません。
ロゴを重ねる場合などは、実際のスマートフォンで読み取りテストを行うことが重要です。
SVG形式でQRコードを生成する
WebサイトではPNGだけでなく、SVG形式でQRコードを出力する方法もあります。
SVGはベクター形式のため、拡大しても画質が劣化しにくい点が特徴です。
印刷物や高解像度ディスプレイで利用するときに適しています。
一方で、一般的な画像ファイルとして保存したい場合やメールなどで利用したい場合は、PNGのほうが扱いやすいこともあります。
chillerlan/php-qrcodeを利用する方法
PHP向けのQRコード生成ライブラリとしては、chillerlan/php-qrcodeもあります。
Composerでは次のようにインストールできます。
composer require chillerlan/php-qrcode
QRコードの生成だけでなく、QRコードの読み取りに関する機能も提供されています。
PHPの対応バージョンに注意する
chillerlan/php-qrcodeは、バージョンによって必要なPHPバージョンが異なります。
そのため、インストールするときはPackagistや公式GitHubで使用するバージョンの要件を確認することが重要です。
特にGitHubのmainブランチは、安定版より先の開発バージョンになっている場合があります。
mainブランチのサンプルコードをそのまま古い安定版で使用すると、APIの違いによって動作しない可能性があります。
必ずインストールしたバージョンと一致するドキュメントを参照しましょう。
LaravelやSymfonyでもQRコードを生成できる
LaravelやSymfonyなどのPHPフレームワークでも、Composerライブラリを利用してQRコードを生成できます。
基本的な仕組みは通常のPHPと同じです。
Symfonyの場合
Symfonyでは、endroid/qr-code向けのBundleを利用する方法があります。
設定ファイルやTwigなどと連携できるため、Symfonyアプリケーションへ組み込みやすくなっています。
Laravelの場合
LaravelでもQRコード関連のパッケージを利用できます。
ただし、Laravel向けのラッパーパッケージは内部で別のQRコードライブラリに依存している場合があります。
そのため、使用中のLaravelやPHPのバージョンだけでなく、依存ライブラリのバージョンやメンテナンス状況も確認したほうがよいでしょう。
必要であれば、LaravelからComposerライブラリを直接利用する方法もあります。
QRコード画像をデータベースへ保存する必要はある?
QRコード画像そのものをデータベースへ保存する必要は必ずしもありません。
たとえば、商品ページのURLをQRコード化する場合は、
https://example.com/products/123
という元データがあれば、必要なタイミングでQRコードを再生成できます。
そのため、
データベースからURLを取得
↓
PHPでQRコードを生成
↓
ブラウザへ出力
という構成にできます。
アクセスが多い場合はキャッシュを利用する
アクセス数が多い場合は、リクエストのたびにQRコードを生成するとサーバー負荷が増える可能性があります。
その場合は、
初回アクセス
↓
QRコードを生成
↓
PNGやSVGとしてキャッシュ
↓
2回目以降はキャッシュを配信
という仕組みを利用すると効率的です。
CDNと組み合わせて配信する方法もあります。
QRコードへ重要な情報を直接入れない
QRコードはデータを視覚的なパターンへ変換したものであり、QRコードそのものに暗号化機能があるわけではありません。
そのため、第三者がQRコードを読み取れば、格納されている内容を確認できる可能性があります。
次のような情報を直接埋め込む場合は注意が必要です。
- メールアドレス
- 電話番号
- 個人情報
- 認証情報
- アクセストークン
- 会員情報
電子チケットや会員証などでは、重要な情報そのものではなく、ランダムなトークンや識別子をQRコードへ入れる方法があります。
QRコード
↓
推測困難なトークン
↓
サーバー
↓
データベースから情報を取得
たとえば、
https://example.com/ticket/ランダムなトークン
のようなURLをQRコードへ登録します。
トークンを使う場合もセキュリティ対策が必要
トークンを利用すれば自動的に安全になるわけではありません。
実際のシステムでは、次のような対策も検討します。
- HTTPSを利用する
- 推測困難なトークンを生成する
- 有効期限を設定する
- 必要に応じて一度だけ利用可能にする
- サーバー側で失効できるようにする
- 利用者の権限を確認する
特に電子チケットや認証用途では、サーバー側での検証処理が重要です。
動的QRコードをPHPで作る仕組み
「動的QRコード」と呼ばれるものは、一般的にはQRコード自体を書き換えるのではなく、QRコードに固定のリダイレクトURLを登録する仕組みです。
たとえばQRコードには、
https://example.com/q/abc123
というURLを登録します。
サーバー側では、
abc123
↓
https://example.com/campaign/summer
という転送設定を管理します。
その後、
abc123
↓
https://example.com/campaign/autumn
へ変更すれば、印刷済みのQRコードを変更しなくても転送先を変更できます。
マーケティング用途にも活用できる
動的QRコードとアクセス解析を組み合わせれば、QRコード経由のアクセスを計測できます。
たとえば、次のような情報を記録できます。
- QRコードの識別ID
- アクセス日時
- アクセス回数
- キャンペーンID
- 遷移先ページ
Webマーケティングでは、
QRコード
↓
自社ドメインのリダイレクトURL
↓
アクセスを計測
↓
キャンペーンLPへ転送
という構成にすると管理しやすくなります。
印刷物の差し替えをせずに遷移先を変更できる点もメリットです。
PHPでQRコードを生成するときの注意点
PHPでQRコードを生成するときは、画像が表示できるだけでなく、実際に安定して読み取れるか確認することが大切です。
QRコード周囲の余白を確保する
QRコードの周囲には、読み取りに必要な余白を設けます。
デザイン上の理由から余白を極端に削ると、スマートフォンなどで認識しにくくなる可能性があります。
背景とのコントラストを確保する
QRコード部分と背景の色が近すぎると、読み取り精度が下がる可能性があります。
基本的には、背景とQRコード部分の明暗差を十分に確保しましょう。
実際のスマートフォンで読み取りテストをする
QRコードを生成したら、実際の端末で読み取れるか確認します。
可能であれば、iPhoneやAndroidなど複数の環境でテストすると安心です。
印刷物で使用する場合は、実際に印刷した状態でも確認しましょう。
ライブラリのバージョンを確認する
PHPライブラリは、メジャーバージョンアップによってAPIやPHPの対応バージョンが変更されることがあります。
Web上の古いサンプルコードをそのままコピーすると動作しない場合があります。
Composerでインストールされたバージョンを確認し、そのバージョンに対応した公式ドキュメントを参照してください。
PHPでQRコードを生成する基本的な流れ
PHPでQRコードを生成する処理を整理すると、次のようになります。
Composerを用意
↓
QRコード生成ライブラリをインストール
↓
URLや文字列を用意
↓
QRコードを生成
↓
PNGやSVGへ変換
↓
ファイル保存またはブラウザへ出力
PHPでQRコードを生成する場合は、endroid/qr-codeやchillerlan/php-qrcodeなどのComposerライブラリを利用する方法が現実的です。
単純なURLのQRコード化だけでなく、商品ページ、電子チケット、会員証、イベント受付、キャンペーン計測など、さまざまなWebシステムへ応用できます。
一方で、ライブラリによってPHPの対応バージョンやAPIが異なるため、導入時は必ず使用するバージョンの公式ドキュメントを確認しましょう。
また、認証情報や個人情報を扱う場合は、QRコードそのものをセキュリティ機能として考えず、HTTPS、トークン、有効期限、アクセス制御などをサーバー側で適切に実装することが重要です。
以上、PHPでQRコードを生成する方法についてでした。
最後までお読みいただき、ありがとうございました。










