2010-11-06 28 views
2

我使用phing和yui壓縮器自動執行一些任務,並且遇到內存問題。我很好奇,如果有更好的方法來處理這個問題。 phing構建腳本的php exec內存使用與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)。如果有辦法處理這個w /只有一個目標 - 我想知道! :)

回答

4

我可以看到這個使用這麼多內存的唯一原因是yuiCompressor正在輸出大量的信息到標準輸出。然後這被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>