【问题标题】:php exec memory usage with phingphp exec 内存使用与 phing
【发布时间】:2011-05-06 01:21:20
【问题描述】:

我正在使用 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)。如果有一种方法可以处理这个只有一个目标 - 我想知道! :)

【问题讨论】:

    标签: php memory command-line phing yui-compressor


    【解决方案1】:

    我可以看到它使用这么多内存的唯一原因是 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>
    

    【讨论】: