QR Code(快速回應碼)廣泛應用於行動支付、網址分享、登入驗證、資訊標籤等場景。本文示範使用 PHP QR Code 庫(基於 libqrencode)快速生成 QR Code 圖片,支援容錯等級、尺寸、輸出路徑自訂。
環境準備
- 下載 PHP QR Code 庫,解壓至專案目錄。
- 確保 PHP 支援 GD 擴展(`extension=gd`)。
- 建立可寫入的暫存目錄(如 `temp/`)。
核心程式碼
<?php
ini_set('display_errors', 'on');
// 目錄設定
$PNG_TEMP_DIR = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR;
$PNG_WEB_DIR = 'temp/';
// 引入庫檔
include "qrlib.php";
// 參數設定
$data = 'https://example.com/demo?qrcode=123'; // 編碼內容
$ecc = 'H'; // 容錯等級:L(7%) M(15%) Q(25%) H(30%)
$size = 10; // 模組大小:1-10(圖片寬高 = size * 37 + 8*size 約略)
$margin = 2; // 邊距(靜默區模組數)
// 產生檔案名
$filename = $PNG_TEMP_DIR . 'qrcode_' . time() . '.png';
// 生成 QR Code
QRcode::png($data, $filename, $ecc, $size, $margin);
// 設定權限(視伺服器環境)
chmod($filename, 0644);
// 輸出圖片標籤
echo '
';
?>
參數詳細說明
| 參數 | 型別 | 範圍/選項 | 說明 |
$data | string | - | 編碼內容,建議 < 2KB |
$ecc | string | L, M, Q, H | 容錯等級:H 最高,適合有 Logo 覆蓋場景 |
$size | int | 1-10 | 每個模組像素大小,越大圖片越清晰 |
$margin | int | 0-10 | 四周靜默區寬度(模組數),掃描器需要 |
$saveandprint | bool | true/false | true 存檔並輸出,false 僅存檔 |
$back_color | array | [R,G,B] | 背景色,預設白色 [255,255,255] |
$fore_color | array | [R,G,B] | 前景色,預設黑色 [0,0,0] |
進階應用範例
1. 直接輸出圖片串流(不存檔)
<?php
include "qrlib.php";
header('Content-Type: image/png');
QRcode::png('https://example.com', false, 'H', 8, 2); // false 直接輸出
2. 批次生成多組 QR Code
<?php
include "qrlib.php";
$items = [
'PROD001' => 'https://shop.example.com/p/001',
'PROD002' => 'https://shop.example.com/p/002',
'PROD003' => 'https://shop.example.com/p/003',
];
foreach ($items as $sku => $url) {
$file = "temp/qrcode_{$sku}.png";
QRcode::png($url, $file, 'M', 6, 2);
echo "
";
}
3. 內嵌 Logo(需 GD 進階處理)
<?php
include "qrlib.php";
$data = 'https://example.com';
$qr_file = 'temp/qr_raw.png';
$logo_file = 'logo.png';
$out_file = 'temp/qr_with_logo.png';
QRcode::png($data, $qr_file, 'H', 10, 2); // H 等級容錯支援遮蓋
$qr = imagecreatefrompng($qr_file);
$logo = imagecreatefrompng($logo_file);
$qr_w = imagesx($qr);
$qr_h = imagesy($qr);
$logo_w = imagesx($logo);
$logo_h = imagesy($logo);
// Logo 置中,佔 QR Code 20% 面積
$dst_x = ($qr_w - $logo_w) / 2;
$dst_y = ($qr_h - $logo_h) / 2;
imagecopy($qr, $logo, $dst_x, $dst_y, 0, 0, $logo_w, $logo_h);
imagepng($qr, $out_file);
imagedestroy($qr);
imagedestroy($logo);
echo "
";
常見問題排查
- 圖片不顯示:檢查 `temp/` 目錄權限、Web 根目錄對應路徑、GD 擴展是否載入。
- 中文亂碼:確保 PHP 檔案儲存為 UTF-8 無 BOM,`$data` 為 UTF-8 編碼。
- 掃描失敗:提高容錯等級至 `H`、增加 `size`、確保 `margin ≥ 2`、避免 Logo 遮蓋定位點。
- 大量生成效能:單次生成約 10-50ms,批次建議非同步處理或使用 `exec` 呼叫 `qrencode` 指令列工具。
替代方案
| 方案 | 優點 | 缺點 |
| PHP QR Code (libqrencode) | 純 PHP、無系統依賴、易部署 | 效能一般、功能基礎 |
| endroid/qrcode (Composer) | 現代物件導向、支援 Logo、標籤、擴展性佳 | 需 Composer、依賴 GD/Imagick |
| qrencode 指令列工具 | 極高效能、功能完整、可管線化 | 需安裝系統套件、跨平台部署較複雜 |
| Google Chart API (已停用) | 無伺服器負擔 | 已關閉,不可用 |
PHP QR Code 庫輕量易用,適合中小專案快速整合 QR Code 生成功能;大型或高併發系統建議評估 endroid/qrcode 或離線生成 + CDN 快取架構。
- 上一篇文章: PHP 實作 AES-256 加密演算法:純 PHP 實現與 mcrypt 擴展兩種方案
- 下一篇文章: PHP 敏感詞過濾類別:白名單保護機制與黑名單替換實作
Copyright ©
程式碼之家 All Rights Reserved