2012-04-01 14 views
5

Problem, który dziś odkrywam, jest podobny do tego unanswered problem; choć nie to samo, może mieć tę samą przyczynę.Inkscape wewnątrz PHP/Apache nie renderuje czcionek do PNG

Renderuję pliki SVG przy użyciu inkscape jako PNG lub PDF. W przeważającej części zamierzam użyć Gearmana do renderowania ich w tle, ale na razie tworzę kilka miniatur wewnątrz procesu PHP/Apache. Wygląda na to, że jeśli inkscape zostanie wywołany (za pomocą PHP exec) wewnątrz procesu Apache, nie będzie mógł znaleźć czcionek, które musi renderować. W związku z tym elementy graficzne renderują się dobrze, ale żadne elementy tekstowe nie są rysowane w wynikach PNG.

Podejrzewam, że środowisko CLI z wnętrza Apache różni się od mojej zwykłej konsoli Bash w sposób, który oznacza, że ​​czcionki nie są widoczne. Jestem na OS X 10.6.8. Jakieś pomysły?

Edytuj: po dodaniu komentarzy, złapałem php -i wewnątrz Apache i Gearmana i zmieniłem pierwsze na drugie (więc teoretycznie zastosowanie diffu sprawiłoby, że zadziała). result is here.

Edycja 2: Próbowałem już convert -list font w obu środowiskach przy użyciu system - żadnych różnic.

+0

Rozwiązałem ten problem, blokując zadanie o wysokim priorytecie w Gearmanie, co jest moim preferowanym rozwiązaniem - i pomoże mi to utrzymać liczbę równoległych procesów inkscape. Ale nadal uważam, że to pytanie jest bardzo interesujące, więc zachęcam wszystkich, którzy mają pomysły, aby je opublikować! Bounty nadchodzi, gdy maszyna mi pozwala. – halfer

+0

(Zignoruj ​​zgłoszenie - wyraźnie zirytowałam anon_coward, który zrewaloryzował kilka niezwiązanych ze mną stanowisk!) – halfer

+0

+1, brzmi interesująco i nic nie jest z tym problemem :) – kontur

Odpowiedz

3

Jak określono w powyższych uwag, było to spowodowane różnicą środowiska - w HOME env var ustalono inaczej wewnątrz wykonany proces. Korzystanie z proc_open zamiast zwykłego exec dało bardziej precyzyjną kontrolę nad wspomnianym procesem i jednoznaczne ustawienie, że env var rozwiązało problem.

+0

'exec (" HOME =/path/to/home/usr/bin/inkscape ")' również działa. Zastanawiam się, dlaczego czcionki systemowe nie działają z ustawionymi domowymi ustawieniami. – qwazix

1

Dla przypomnienia, oto wykorzystanie proc_open które pomogły rozwiązać ten problem:

$command = "{$exec} --without-gui {$params} {$file} {$redirect}"; 
$return = -1; 
// Comment this out for now 
//exec($command, self::$output, $return); 

$descriptorspec = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
    2 => array("file", "/dev/null", "a") 
); 
$pipes = array(); 
$env = array(
    // Try additional stuff here, but culprit was: 
    'HOME' => '/Users/jon', 
); 
$resource = proc_open(
    $command, 
    $descriptorspec, 
    $pipes, 
    $cwd = null, 
    $env 
); 
+0

Dziękujemy za udostępnienie tej części. Jeszcze jedna obserwacja: czy argumenty w komendzie właściwie uciekły ('escapeshellargs')? – DCoder

+0

Właściwie to nie; dobre pytanie. Czy powinienem używać tego, mimo że nie biorę żadnych argumentów od użytkownika? – halfer

+0

Prowadzę wszystkie argumenty przez to z przyzwyczajenia.Jeśli nie bierzesz żadnych danych wejściowych od użytkownika (twoje nazwy plików są generowane automatycznie i na pewno nie zawierają zbędnych elementów, takich jak spacje), prawdopodobnie jesteś bezpieczny. – DCoder