PHP Imagick 的 setFont 方法执行时间过长

PHP Imagick's setFont method take too long time to execute

我在使用 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是我用的字体文件。

在@Danack的帮助下,我终于解决了这个问题。

这个问题很简单,但是我觉得第一时间真的很难识别。

这个问题是我在字体库中安装了很多新字体,但没有重建字体配置缓存。

因此,每次 Imagick 启动时,它都会尝试获取字体配置,并且字体配置会尝试读取我的字体文件夹中的每种字体以写入字体缓存。

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

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

所以,当我 运行 PHP 使用命令行时,它会工作,因为它有正确的字体缓存,但对于服务器,因为它是 httpd 和 运行使用系统的字体缓存,它不会工作。

所以,目前,PHP 的 imagick 工作正常。

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