PHP Imagick的setFont方法执行

时间:2017-02-26 09:56:13

标签: php image fonts imagemagick imagick

我使用Imagick在我的PHP环境中遇到了一个非常奇怪的问题:

我的环境是这样的:

Darwin 16.4.0 Darwin Kernel Version 16.4.0: Thu Dec 22 22:53:21 PST 2016; root:xnu-3789.41.3~3/RELEASE_X86_64 x86_64

PHP 7.0.16 (cli) (built: Feb 16 2017 22:57:49) ( NTS )

imagick module version => 3.4.3RC4
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel
Imagick compiled with ImageMagick version => ImageMagick 6.9.7-6 Q16 x86_64 2017-02-01 http://www.imagemagick.org
Imagick using ImageMagick library version => ImageMagick 6.9.7-7 Q16 x86_64 2017-02-09 http://www.imagemagick.org

Imagick的方法setFont将花费太长时间来执行(甚至在执行时获得默认的30秒超时)。

代码就像这样:

<?php
    $img = new Imagick();
    $img->setFont("./SpicyRice.ttf");
    echo "Done";

代码$img->setFont("./SpicyRice.ttf")将被卡住。

不会抛出任何错误,PHP只会挂起该方法,并超出默认的30秒执行时间。

有没有人对此有任何想法? This是我使用的字体文件。

1 个答案:

答案 0 :(得分:0)

在@Danack的帮助下,我解决了问题并最终修复了它。

问题很简单,但我认为第一次真的很难识别。

问题在于我在字体库中安装了许多新字体,并没有重建字体配置缓存。

因此,每当Imagick启动时,它会尝试获取字体配置和字体配置,尝试读取我的字体文件夹中的每个字体以写入字体缓存。

但是,由于PHP有超时30秒,因此在重建字体缓存之前PHP进程将失败。所以,这是无穷无尽的问题,除非我在命令行中运行fc-cache命令并生成字体缓存,然后,下次当我调用这个php时,Imagick插件将使用系统的字体缓存代替生成字体的所有信息。

这解释了为什么这在我的命令行中起作用,因为我是系统的用户,系统只会为我创建字体缓存。

因此,当我使用命令行运行PHP时,它会工作,因为它具有正确的字体缓存,但对于服务器,因为它是httpd并使用系统的字体缓存运行,它赢得了#39工作。

所以,就目前而言,PHP的想象力正常。

再次感谢你,@ Danack。没有你的帮助,我不会知道这样的问题。 :)