2010-11-06 45 views
2

J'automatise certaines tâches en utilisant phing et yui compresseur et je cours dans un problème de mémoire. Je suis curieux de savoir s'il existe une meilleure façon de gérer cela.php exec utilisation de la mémoire avec phing

Une partie du script build phing

<target name="finalize"> 
    <property name="cssfolders" value="folder1, folder2, folder3" /> 
    <foreach list="${cssfolders}" param="dir" target="minifyCSS" /> 

    <property name="jsfolders" value="folder1, folder2, folder3" /> 
    <foreach list="${jsfolders}" param="dir" target="minifyJS" /> 
</target> 

<target name="minifyCSS"> 
    <exec command="find ${dir}/dev -name '*.css' -exec basename {} \; | while read file; do java -jar ${yuiCompressor} -o ${dir}/prod/$file ${dir}/dev/$file; done" /> 
</target> 

<target name="minifyJS"> 
    <exec command="find ${dir}/dev -name '*.js' -exec basename {} \; | while read file; do java -jar ${yuiCompressor} -o ${dir}/prod/$file ${dir}/dev/$file; done" /> 
</target> 

Si je divisé la cible Finaliser en deux, l'un pour un pour css et js - le script fonctionnera. Mais quand je les garde combinés, j'ai un problème. Avant que tout le monde dise de juste diviser la cible, ce que je suis d'accord, j'ai peur que plus de fichiers JS sont ajoutés, je vais finir par rencontrer ce problème à nouveau.

Je suis curieux de savoir s'il existe une meilleure façon d'exécuter mon plan sans surveillance continue et l'augmentation de l'utilisation de la mémoire de php. Peut-être une commande plus efficace à exécuter, ou en utilisant une fonction php qui me permettra d'utiliser plus de mémoire ou le disque si j'épuiser les ressources allouées?

Projet de côté - félicitations à tous ceux qui savent comment combiner les cibles miniatures en une seule. Ils sont pratiquement les mêmes sauf que j'ai besoin de savoir quel type de fichier pour "trouver" pour chacun (css ou js). S'il y a un moyen de gérer ce w/une seule cible - je veux savoir! :)

Répondre

4

La seule raison pour laquelle je peux voir cela en utilisant tellement de mémoire est que le yuiCompressor envoie beaucoup d'informations à stdout. Ceci est ensuite capturé par la tâche d'exécution de phing.

Essayez d'appeler la tâche d'exécution avec le paramètre spawn défini sur true, ce qui entraînera la redirection de la sortie stdout vers/dev/null.

<exec command="find ${dir}/dev -name '*.css' -exec basename {} \; | while read file; do java -jar ${yuiCompressor} -o ${dir}/prod/$file ${dir}/dev/$file; done" spawn="true" /> 

En ce qui concerne le projet de côté - peut-être quelque chose comme ça fonctionnerait:

<target name="finalize"> 
    <property name="cssfolders" value="css:folder1, css:folder2, css:folder3" /> 
    <foreach list="${cssfolders}" param="toCompress" target="minify" /> 

    <property name="jsfolders" value="js:folder1, js:folder2, js:folder3" /> 
    <foreach list="${jsfolders}" param="toCompress" target="minify" /> 
</target> 

<target name="minify"> 
    <exec command="type=`echo ${toProcess}|cut -d ':' -f 1`;folder=`echo ${toProcess}|cut -d ':' -f 2`; find $folder/dev -name '*.'$type -exec basename {} \; | while read file; do java -jar ${yuiCompressor} -o $folder/prod/$file $folder/dev/$file; done" /> 
</target>