2017-02-26 1 views
0

j'ai eu un problème très bizarre dans mon environnement PHP en utilisant Imagick:méthode setfont PHP Imagick prendre trop de temps pour exécuter

Mon environnement est comme ceci:

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 

Et la méthode setFont de Imagick sera Coût trop long à exécuter (et même obtenir le délai par défaut de 30 secondes en exécution).

Le code est comme ceci:

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

Et le code $img->setFont("./SpicyRice.ttf") va se coincer.

Aucune erreur n'est levée, PHP se bloque à cette méthode et expire par défaut les 30 secondes d'exécution.

Y a-t-il quelqu'un à qui penser? This est le fichier de police que j'ai utilisé.

+0

Il est probable que certains appels système échouent, ou "se coincent". Si c'était sur ma machine, j'essaierais de l'examiner avec quelque chose comme 'dtruss'. Je pense que lancer 'dtruss php foo.php' devrait montrer les appels système en cours, ce qui pourrait fournir un indice. – Danack

+0

@Danack, et c'est encore bizarre pour moi maintenant, j'ai essayé de lancer le php via lldb, et pour la première fois, ça a pris du temps, mais l'application est lancée, et puis ce problème est résolu la version console de PHP. Mais pour le module PHP à travers Apache2, ça ne marche toujours pas, et je ne sais pas comment je peux en discuter, avez-vous des suggestions? – guitarpoet

+0

strace ou dtruss peut attacher à un processus en cours https://8thlight.com/blog/colin-jones/2015/11/06/dtrace-even-better-than-strace-for-osx.html Bien que peut-être juste vérifier la autorisations de fichiers pour tout, y compris les répertoires temporaires sur le serveur. – Danack

Répondre

0

Avec l'aide de @Danack, je résous le problème et le corrige finalement.

Le problème est si simple, mais il est vraiment difficile à identifier à la première fois, je pense. Le problème pour ceci est que j'ai installé beaucoup de nouvelles polices dans la bibliothèque de polices, et n'ai pas reconstruit le cache de configuration de police. Ainsi, chaque fois que Imagick initie, il essaie d'obtenir la configuration de la police et la configuration de la police essaye de lire chaque police dans mon dossier de police pour écrire le cache des polices. Mais, comme PHP a un délai de 30 secondes, le processus PHP échouera avant que le cache des polices ne soit reconstruit. Donc, c'est un problème sans fin, à moins que j'exécute la commande fc-cache dans la ligne de commande et que je génère le cache des polices, la prochaine fois que j'appellerai ce php, le plugin Imagick utilisera le cache des polices du système. informations pour la police. Et ceci explique pourquoi cela fonctionne dans ma ligne de commande, parce que je suis l'utilisateur du système, et le système créera le cache de police pour moi seulement. Donc, quand je lance PHP en utilisant la ligne de commande, ça marchera, car il a le bon cache de police, mais pour le serveur, puisqu'il est httpd et fonctionne avec le cache de police du système, ça ne marchera pas. Donc, pour l'instant, l'imagick de PHP fonctionne comme d'habitude.

Merci encore, @Danack. Sans votre aide, je ne connaîtrai pas le problème comme ça. :)