2017-02-26 1 views
0

ich ein sehr seltsames Problem in meiner PHP-Umgebung bekam Imagick mit:PHP Imagick des setFont Verfahren zu lange dauern Zeit auszuführen

Meine Umgebung ist wie folgt:

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 

Und die Methode setFont von Imagick wird Die Kosten sind zu lang, um ausgeführt zu werden (und erhalten sogar das Standard-Zeitlimit von 30 Sekunden bei der Ausführung).

Der Code ist wie folgt:

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

Und der Code $img->setFont("./SpicyRice.ttf") stecken wird.

Kein Fehler wird geworfen, PHP hängen nur bei dieser Methode, und Timeout der Standard 30 Sekunden der Ausführung.

Gibt es jemanden, der darüber irgendwelche Gedanken hat? This ist die Schriftartendatei, die ich verwendet habe.

+0

Es ist wahrscheinlich, dass ein Systemaufruf fehlschlägt oder "stecken bleibt". Wenn das auf meiner Maschine wäre, würde ich versuchen, es mit etwas wie "Dtruss" zu untersuchen. Ich denke, das Ausführen von 'dtruss php foo.php' sollte die Systemaufrufe anzeigen, die einen Hinweis liefern könnten. – Danack

+0

@Danack, und es ist sogar seltsam für mich jetzt, ich habe versucht, den PHP durch lldb zu laufen, und zum ersten Mal, es dauerte eine lange Zeit, aber die Anwendung ausgeführt haben, und dann ist dieses Problem in gelöst die Konsolenversion von PHP. Aber für das PHP Apache2-Modul funktioniert es immer noch nicht, und ich weiß nicht, wie kann ich dafür streiten, haben Sie irgendwelche Vorschläge? – guitarpoet

+0

Strace oder Dtruss kann an einen laufenden Prozess anhängen https://8thlight.com/blog/colin-jones/2015/11/06/dtrace-even-better-than-strace-for-osx.html Obwohl möglicherweise nur das überprüfen Dateiberechtigungen für alles, einschließlich temporäre Verzeichnisse auf dem Server. – Danack

Antwort

0

Mit der Hilfe von @ Danack, löse ich das Problem und beheben Sie es schließlich.

Das Problem ist so einfach, aber es ist wirklich schwer zu identifizieren, denke ich.

Das Problem dafür ist, dass ich viele neue Schriftarten in der Schriftart-Bibliothek installiert und den Schriftart-Konfigurationscache nicht neu erstellt habe.

Also, jedes Mal, wenn Imagick initing, versuchen Sie, die Schriftart Config und die Schriftart config versuchen, jede Schriftart in meinem Font-Ordner zu lesen, um den Font-Cache zu schreiben.

Da PHP jedoch eine Zeitüberschreitung von 30 Sekunden hat, wird der PHP-Prozess fehlschlagen, bevor der Font-Cache wiederhergestellt wird. Also, dieses Problem ist endlos, es sei denn, ich führe den fc-cache Befehl in der Kommandozeile aus und erzeuge den Font Cache. Wenn ich das php dann das nächste Mal anrufe, benutzt das Imagick Plugin stattdessen den font Cache des Systems Informationen für die Schriftart.

Und dies erklärt, warum dies in meiner Befehlszeile funktioniert, weil ich der Benutzer des Systems bin, und das System wird nur für mich Schriftart-Cache erstellen.

Also, wenn ich die PHP-Befehlszeile ausführen, wird es funktionieren, da es den richtigen Font-Cache hat, aber für den Server, da es httpd ist und mit System Font-Cache ausgeführt wird, wird es nicht funktionieren.

Also, im Moment funktioniert PHP Imagick wie normal.

Nochmals vielen Dank, @Danack. Ohne Ihre Hilfe werde ich das Problem nicht so kennen. :)

Verwandte Themen