QRcode::png() 是最直接可用的二维码生成方式,但需确保 GD 扩展启用且未禁用 imagecreate() 等函数;CodeIgniter 原生 image_lib 不支持二维码编码;推荐使用轻量 phpqrcode 库,注意路径权限、容错等级字符串传参及 CI4 中封装为服务类。

QRcode::png() 是最直接可用的方式,但必须确认 GD 扩展已启用且 php.ini 中未禁用 exec 或图像函数——否则会静默失败或报 Call to undefined function imagecreate()。
为什么不用 CodeIgniter 原生库生成二维码
CodeIgniter 3.x / 4.x 的 image_lib 类只支持缩放、裁剪、旋转等基础图像操作,不包含二维码编码逻辑。它依赖 GD 或 ImageMagick 渲染已有图像,无法从字符串生成 QR 矩阵。强行用 imageline() 手绘二维码不仅开发成本高,还难以保证容错率和扫码兼容性。
推荐用 phpqrcode 库(轻量、无 Composer 强制依赖)
这是 CI 项目中最成熟、部署最简单的选择,无需额外服务或扩展:
- 下载
phpqrcode.php单文件(官方最新版 v1.1.4),放入application/libraries/目录 - 在控制器中加载:
$this->load->library('phpqrcode'); - 调用时注意路径权限:
FCPATH . 'uploads/qrcode/'必须可写,否则QRcode::png()报错但不抛异常 - 容错等级参数是字符串:
'L'、'M'、'Q'、'H',传数字会生成无效码 - 示例生成本地文件:
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; - 避免直接输出到浏览器(易被 header 已发送错误中断),优先生成文件路径并返回
base_url()可访问地址 - 若需带 logo,不能靠 GD 合成后再调用
QRcode::png()—— 它不支持叠加;得先生成二维码 PNG,再用imagecreatefrompng()+imagecopyresized()手动贴图
容易被忽略的两个硬性前提
一是服务器必须有 GD 扩展且开启 imagepng()、imagecreatetruecolor() 等函数,仅装 ImageMagick 不行;二是生成目录的父路径(如 uploads/)必须存在且 PHP 进程有写权限,mkdir(..., 0777, true) 在某些 SELinux 环境下仍会失败,得配合 chcon -t httpd_sys_rw_content_t 调整上下文。


















