简短问题

我想将GDFONTPATH环境变量从Apachevhost.conf传递给PHP.我怎么能这样做呢?

我在运行:Debian 12、Apache2.4、PHP 8.2

长长的问题

我正在使用PHP中的GD图像函数(例如imagettftext),并希望使用可能在系统范围内不可用的特定字体.这可以通过设置环境变量GDFONTPATH来完成,并且PHP函数putenv适合于此目的.

但是,putenv也是一个安全问题,因此在我的生产服务器上,我将它列在我的php.ini中的disable_functions上,因此,我不能在我的PHP脚本中设置这个环境变量.相反,在我的Apachevhost.conf文件中使用SetEnv来设置它似乎是个好主意(这是一个简化的示例):

<Directory "/srv/www/example.com/public">
  AllowOverride None
  Require all granted
  SetEnv GDFONTPATH "/srv/www/example.com/private/fonts"
</Directory>

问题是,这并不像[我]预期的那样有效!它does设置了GDFONTPATH,但不是本地的,所以我得到了以下结果:

getenv('GDFONTPATH');        # Returns '/srv/www/example.com/private/fonts'
getenv('GDFONTPATH', true);  # Returns ''

Libgd函数忽略了这一点;它们只查看我似乎只能使用putenv函数设置的local环境变量.但是出于安全原因,在我的生产服务器上启用putenv是不现实的,因此我的really希望在我的Apache配置中使用SetEnv

FWIW:我已经编写了一个"实用的"解决方案,它将使用PHPgetenv从ApacheSetEnv读取路径,然后将一个完全限定的字体文件名传递给gdlib.这是可行的,但并不理想!我可能会发布这段代码以供将来参考,但我真的很想要一个解决方案,在其中我可以从Apache中设置环境.This post might offer a potential solution,但看起来它将适用于所有vhost,因此,再一次,不理想.

我对环境变量和"局部"环境变量之间的区别有点粗略.

参考资料: libgd source regarding GDFONTPATH libgd source regarding GDFONTPATH libgd source regarding GDFONTPATH

推荐答案

SetEnv GDFONTPATH"..."

正如您已经发现的,对于102 variables,SetEnv GDFONTPATH"..."Apache HTTPD 101可以通过PPS的SAPI通过getenv()访问,但不能通过getenv(...,true)访问.简单地说,PHP getenv()S‘$LOCAL=TRUE变量aren't个apache 内部环境变量.

GDFONTPATH

GDFONTPATH system environment variable由gdlib用作Font-Search-Path参数,类似于PATH,但用于字体文件,而不是可执行文件.

这是有意义的,例如,要访问系统配置的字体,这类似于在该系统上执行二进制文件:指定基本名称就足够了.

但是,当您打算使用系统上未配置字体文件时,同样与二进制文件类似,您需要提供字体的绝对路径名,该字体解析为该字体的类型为FILE的目录条目,可由运行PHP进程的用户读取.[credentials(7)][晓雨-0920交稿]

$font_dirname = '/srv/www/example.com/private/fonts';
$font_basename = 'example.ttf';

$font_filename = $font_dirname . '/' . $font_basename;

set_error_handler(fn (int $type, string $message, string $file = null, int $line = null)
    => throw new ErrorException($message, 0, $type, $file, $line),
    E_ALL,
);

imagettftext($image, $size, $angle, $x, $y, $color, $font_filename, $text);

restore_error_handler();

测试对象:

  • PHP 8.2
  • Gd库2.3.3
  • GDFONTPATH未设置

GDFONTPATH参考文献:

Php相关问答推荐

如何使用查询范围在Statamic中按组过滤用户?

通过激活模板在数据库中创建表

无法在Laravel/Vue停靠容器中启动MySQL

PHP原始数据读取引发max_input_vars错误

WooCommerce:在 checkout 审核单和发票中显示定制产品数据

在WooCommerce中禁用客户用户角色的纳税计算

Php解压缩deflate64

PHP测试字符串的所有POST值

免费送货柜台,考虑到折扣码

Symfony 6.2 IsGraned具有多个角色

这是在可召回的背景下吗?

从目录文件夹中获取文件并追加到 Select 下拉列表(选项)-wordpress/wc

是否使用联系人表单7 wpcf7_Feedback_Response输出答复中的html?

用GUZLE模拟Read_Timeout

未定义的类型';PDF';在Laravel 8

为什么从一个页面到另一个页面都找不到 JQuery,因为它们使用相同的 twig 模板?

无法读取某些 WordPress 主机上的 cookie

如何在WooCommerce中为访客购买者分配自定义客户代码

在 DomPDF 和 Laravel 中使用内联 css

我正在使用 Baryryvdh/laravel-snappy 从 HTML 导出 PDF 它正在工作但缩小了 pdf 文件