You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2 PHP多环境PDF图片不显示求助(Beta环境异常)

问题排查与解决方案

针对Yii2项目中kartik-v/yii2-mpdf扩展在Beta环境无法显示PDF图片的问题,结合环境差异逐一排查:

1. 服务器网络与PHP配置限制

  • 验证远程图片访问:在Beta服务器执行curl https://test.com/[具体图片路径],确认能否获取图片内容。若失败,检查服务器防火墙/安全组是否放行该域名的HTTPS请求,或DNS解析是否正常。
  • 检查allow_url_fopen状态:在Beta环境生成phpinfo页面,确认allow_url_fopen为On。若为Off,修改php.ini开启该配置后重启PHP服务。
  • 本地图片权限检查:若图片存储在Beta服务器本地,确保MPDF运行进程(如www-data)拥有读取权限,文件权限设为644,目录权限设为755。

2. MPDF配置差异调整

当前代码使用MODE_CORE模式,可尝试切换模式并强制开启远程图片加载:

$pdf = new Pdf([
    'mode' => Pdf::MODE_UTF8,
    'format' => Pdf::FORMAT_A4,
    'orientation' => Pdf::ORIENT_PORTRAIT,
    'content' => $table,
    'filename' => "records.pdf",
    'options' => [
        'enableRemoteImages' => true,
        'isRemoteEnabled' => true,
    ],
]);

同时确认Beta服务器安装了GD库或Imagick扩展(MPDF处理图片依赖),可通过php -m命令查看已安装扩展。

3. 图片URL与Base64编码有效性验证

  • 确认URL可访问:在Beta环境直接访问图片URL,确认能正常打开。若为内部域名,需确保Beta服务器能解析该域名。
  • 调试Base64编码:在Beta环境输出$imagedata值,若file_get_contents返回false,添加错误捕获:
$image = @file_get_contents($img_url);
if ($image === false) {
    error_log("Failed to fetch image: " . $img_url);
    // 用默认图片替代
    $imagedata = base64_encode(file_get_contents('/path/to/default-image.png'));
}

4. 版本一致性检查

确保本地、测试、Beta环境的kartik-v/yii2-mpdf及底层mpdf/mpdf版本一致,可通过composer show kartik-v/yii2-mpdf查看版本,不一致则统一版本。

额外优化建议

  • 避免直接拼接HTML字符串,改用Yii2视图渲染:$this->renderPartial('_pdf-content', ['models' => $models]),减少语法错误。
  • Base64方式动态获取图片MIME类型,避免硬编码:
$imageInfo = getimagesize($img_url);
$mimeType = $imageInfo['mime'];
$imagedata = base64_encode($image);
$imgSrc = "data:$mimeType;base64,$imagedata";

内容的提问来源于stack exchange,提问作者Krishna Ramchandani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:12:06