2011-07-29 6 views
1

Est-il possible d'exécuter plusieurs commandes dans une seule commande exec? Je dois saisir des images à partir de fichiers SVG et cette variante est trop lent:Exécuter plusieurs commandes inkscape en une ligne

exec('inkscape file.svg --export-id=g123 --export-png=img1.png'); 
exec('inkscape file.svg --export-id=g124 --export-png=img2.png'); 
exec('inkscape file.svg --export-id=g125 --export-png=img3.png'); 

donc je dois faire tout en une seule ligne. J'ai déjà essayé ceci:

exec('inkscape file.svg --export-id=g125 --export-png=img3.png inkscape file.svg --export-id=g123 --export-png=img1.png'); 

Mais ceci n'extrait que la dernière image. Exec() n'est probablement pas lent.

Répondre

1

Le serveur/inkscape est lent.

+0

Même lorsque vous combinez à une ligne (en utilisant ';'), ce ne sera pas plus rapide. Inkscape est le goulot d'étranglement (comme l'a déjà dit @Genesis). @Genesis pourquoi devrait-il changer pour shell? Inkscape est le goulot d'étranglement, alors changer PHP en shell n'aura pas vraiment d'importance, n'est-ce pas? – elslooo

+0

@TimvanElsloo: dernière phrase supprimée :) – genesis

2

exec() lui-même n'est pas lent. Mais à chaque appel, vous devez d'abord lancer Inkscape, effectuer l'opération et la refermer. C'est-à-dire, ce qui prend tellement de temps.

Malheureusement, Inkscape n'a pas de mode de traitement par lots. Bu vous pouvez utiliser Gimp, qui peut faire la même opération en batch.

1

Vous pouvez lancer Inkscape en mode shell et communiquer avec lui en écrivant des commandes sur son stdin. Si vous ne voulez pas le mettre en œuvre en PHP, vous pouvez écrire simple wrapper shell qui le fait pour vous, par exemple:

#!/bin/bash 
SVG="$1" 
shift 
(
while [ "$1" != "" ] ; do 
    echo "\"--file=$SVG\" \"--export-id=$1\" \"--export-png=$2\"" 
    shift 2 
done 
echo "quit" 
) | \ 
    /path/to/inkscape --shell 2>/dev/null 

Et puis utiliser comme ça

exec("/path/to/wrapper file.svg g123 img1.png g124 img2.png g125 img3.png"); 
Questions connexes