【问题标题】:PHP Imagick's setFont method take too long time to executePHP Imagick 的 setFont 方法执行时间过长
【发布时间】:2017-07-16 23:05:02
【问题描述】:

我在使用 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-&gt;setFont("./SpicyRice.ttf")会卡住。

没有抛出错误,PHP 只是挂在那个方法上,并且默认的 30 秒执行超时。

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

【问题讨论】:

  • 很可能是某个系统调用失败了,或者“卡住了”。如果这是在我的机器上,我会尝试用dtruss 之类的东西来调查它。我认为运行dtruss php foo.php 应该会显示正在进行的系统调用,这可能会提供线索。
  • @Danack,现在对我来说甚至很奇怪,我尝试通过 lldb 运行 php,第一次花了很长时间,但是让应用程序运行,然后在PHP的控制台版本中解决了这个问题。但是对于通过Apache2模块的PHP,它仍然无法正常工作,我不知道我该如何解决这个问题,您有什么建议吗?
  • strace 或 dtruss 可以附加到正在运行的进程 8thlight.com/blog/colin-jones/2015/11/06/… 虽然可能只是检查所有内容的文件权限,包括服务器上的临时目录。
  • @Danack 我已经使用DTrace检查了问题,我发现当我尝试访问PHP时,系统将进入无限循环:select(0x0,0x0,0x0,0x0, 0x7FFF4FDDCB70) = 0 0 wait4(0xFFFFFFFF, 0x7FFF4FDDCB54, 0x3) = 0 0 选择(0x0, 0x0, 0x0, 0x0, 0x7FFF4FDDCB70) = 0 0 wait4(0xFFFFFFFF, 0x7FFF4FDDCB54, 0x3) = 0 0 看起来,文件,但一直等待它。你知道我可以从这里做什么吗?
  • 您能在某处发布更多 DTrace 输出吗?

标签: php image fonts imagemagick imagick


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 2018-01-19
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多