2010-11-06 2 views
2

Я автоматизирую некоторые задачи, используя компрессор phing и yui, и я столкнулся с проблемой памяти. Мне любопытно, есть ли лучший способ справиться с этим.Использование памяти php exec с phing

Часть 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> 

Если я дробить цель ФИНАЛИЗ на два, один для CSS и один для JS - то скрипт будет работать. Но когда я их совмещаю, у меня проблема. Прежде чем все скажут, что нужно просто разделить цель, с которой я в порядке, я боюсь, что, когда будет добавлено больше JS-файлов, я снова займусь этой проблемой.

Мне любопытно, есть ли лучший способ выполнить мой план с постоянным мониторингом и увеличением использования памяти php. Возможно, более эффективная команда для выполнения или использование функции php, которая позволит мне использовать больше памяти или диска, если я исчерпаю выделенные ресурсы?

Боковой проект - прикосновение к любому, кто знает, как объединить миниируемые цели в один. Они практически одинаковы, за исключением того, что мне нужно знать, какой тип файла «найти» для каждого из них (css или js). Если есть способ справиться с этой проблемой, я хочу знать! :)

ответ

4

Единственная причина, по которой я могу это увидеть, используя так много памяти, состоит в том, что yuiCompressor выводит много информации на stdout. Затем это захватывается задачей выполнения phing.

Попробуйте вызвать задачу выполнения с параметром spawn, установленным в true, что приведет к перенаправлению stdout на/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" /> 

Что касается побочного проекта - возможно, что-то, как это будет работать:

<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> 
Смежные вопросы