2

我正在使用 phing 和 yui 压缩器自动执行一些任务,但遇到了内存问题。我很好奇是否有更好的方法来处理这个问题。

部分 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>

如果我将 finalize 目标分成两个,一个用于 css,一个用于 js - 那么脚本将起作用。但是当我将它们结合在一起时,我遇到了问题。在每个人都说只拆分目标之前,我可以这样做,我担心随着更多 JS 文件的添加,我最终会再次遇到这个问题。

我很好奇是否有更好的方法来执行我的计划而无需持续监控和增加 php 的内存使用量。也许是一个更有效的命令来执行,或者使用一个 php 函数,如果我用尽分配的资源,它可以让我使用更多的内存或磁盘?

副项目 - 任何知道如何将缩小目标组合成一个的人的荣誉。它们实际上是相同的,只是我需要知道要为每个文件“查找”哪种类型的文件(css 或 js)。如果有一种方法可以处理这个只有一个目标 - 我想知道!:)

4

1 回答 1

4

我可以看到使用这么多内存的唯一原因是 yuiCompressor 正在向标准输出输出大量信息。然后由 phing 执行任务捕获。

尝试在 spawn 参数设置为 true 的情况下调用执行任务,这将导致它将标准输出重定向到 /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>
于 2010-12-20T12:33:55.050 回答