最省事的动态生成方式是直接用QRcode::png(),但需确认GD扩展启用、imagecreate()未禁用且输出目录可写;CodeIgniter原生image_lib不支持QR编码逻辑,仅能处理已有图像几何操作。

直接用 QRcode::png() 是最省事的动态生成方式,但必须确认 GD 扩展已启用、imagecreate() 未被禁用,且输出目录可写——否则会静默失败或报错 Call to undefined function imagecreate()。
为什么不能靠 CodeIgniter 原生 image_lib 生成二维码
CodeIgniter 3/4 的 image_lib 只做图像几何操作(缩放、裁剪、旋转),不包含 QR 编码逻辑。它依赖 GD 或 ImageMagick 渲染已有图像,无法从字符串生成二维码矩阵。试图用 imageline() 手绘不仅开发成本高,还难以保证容错率和扫码兼容性。
用 phpqrcode 实现动态生成的实操要点
推荐使用单文件库 phpqrcode.php(v1.1.4),部署简单、无 Composer 强制依赖:
- 下载后放入
application/libraries/目录 - 控制器中加载:
$this->load->library('phpqrcode'); - 确保
FCPATH . 'uploads/qrcode/'存在且 PHP 进程有写权限(mkdir()在 SELinux 环境下可能需配合chcon -t httpd_sys_rw_content_t) - 容错等级参数是字符串:
'L'、'M'、'Q'、'H';传数字(如2)会导致生成无效码 - 示例调用:
QRcode::png('https://example.com', FCPATH . 'uploads/qrcode/test.png', 'M', 4, 2);
CI 4 中封装为服务类更安全
CI 4 不再默认支持 load->library() 加载非命名空间类,建议封装成服务:
- 新建
app/Services/QrCodeService.php,用require_once引入phpqrcode.php - 方法内校验输入:
if (empty($data) || !is_string($data)) return false; - 避免直接输出到浏览器(易触发
headers already sent),优先生成文件路径并返回base_url()可访问地址 - 若需带 logo,不能靠
QRcode::png()后叠加——它不返回 GD 资源;得改用QRcode::text()获取矩阵,再用 GD 手动绘制+合成
真正卡住人的从来不是“怎么写”,而是 GD 是否真可用、目录权限是否真生效、容错等级和 logo 尺寸是否匹配——这三个点没验过,90% 的“生成失败”都白调半天。











