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

PHP Imagick的setFont方法执行时间太长,php,image,fonts,imagemagick,imagick,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.3

我在使用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
<?php
    $img = new Imagick();
    $img->setFont("./SpicyRice.ttf");
    echo "Done";
Imagick的setFont方法执行起来会花费太长时间,甚至在执行过程中会得到默认的30秒超时

代码如下所示:

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
<?php
    $img = new Imagick();
    $img->setFont("./SpicyRice.ttf");
    echo "Done";
代码$img->setFont./SpicyRice.ttf将被卡住

没有抛出错误,PHP只是挂起该方法,并超时默认的30秒执行


有人对此有什么想法吗?是我使用的字体文件。

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

问题很简单,但我认为第一次就很难确定

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

因此,每次Imagick初始化时,它都会尝试获取字体配置,字体配置会尝试读取我的字体文件夹中的每个字体,以写入字体缓存

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

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

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

因此,目前PHP的imagick工作正常


再次感谢你,丹纳克。没有你的帮助,我不会知道这样的问题

很可能是某些系统调用失败或卡住了。如果这是在我的机器上,我会尝试用DTRUS之类的东西进行调查。我认为运行dtruss php foo.php应该会显示正在进行的系统调用,这可能会提供一个线索。@Danack,现在对我来说更奇怪,我尝试通过lldb运行php,这是第一次,花费了相当长的时间,但让应用程序运行,然后这个问题在php的控制台版本中得到解决。但是对于通过Apache2的PHP模块,它仍然不起作用,我不知道如何使用DTRUS,您有什么建议吗?strace或DTRUS可以附加到正在运行的进程,尽管可能只是检查所有内容的文件权限,包括服务器上的临时目录。@Danack我使用DTrace检查了这个问题,我发现当我尝试访问PHP时,系统将进入无限循环:选择0x0,0x0,0x0,0x0,0x7FFF4FDDCB70=0 0 0 Wait40xFFFFFFFFF,0x7FFF4FDDCB54,0x3=0 0 0选择0x0,0x0,0x0,0x7FFF4FDDCB70=0 0 Wait40xFFFFFFFFF,0x7FFF4FDDCB54,0x3=0,它试图打开某个文件,但一直在等待。你知道我可以从这里做什么吗?你能把更多的DTrace输出发布到某个地方吗?