使大型处理工作变小

Roc*_*ord 4 php iteration recursion zend-framework

这是我正在使用的代码,因为我正在努力解决方案.

 public function indexAction()
    {
        //id3 options
        $options = array("version" => 3.0, "encoding" => Zend_Media_Id3_Encoding::ISO88591, "compat" => true);
        //path to collection
        $path = APPLICATION_PATH . '/../public/Media/Music/';//Currently Approx 2000 files
        //inner iterator
        $dir = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS);
        //iterator
        $iterator = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
        foreach ($iterator as $file) {
            if (!$file->isDir() && $file->getExtension() === 'mp3') {
                //real path to mp3 file
                $filePath = $file->getRealPath();
                Zend_Debug::dump($filePath);//current results: accepted path no errors
                $id3 = new Zend_Media_Id3v2($filePath, $options);
                foreach ($id3->getFramesByIdentifier("T*") as $frame) {
                    $data[$frame->identifier] = $frame->text;
                }
                Zend_Debug::dump($data);//currently can scan the whole collection without timing out, but APIC data not being processed.
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题:在多个目录中处理mp3文件的文件系统.将id3标记数据提取到数据库(3个表),并将标记中的封面图像提取到单独的文件中.

我可以处理实际的提取和数据处理.我的问题是输出.

通过Zend Framework 1.x处理输出缓冲的方式,输出正在处理文件的指示器很困难.在没有输出缓冲的旧式PHP脚本中,您可以在循环的每次迭代中打印出一些html,并有一些进度指示.

我希望能够处理每个专辑的目录,输出结果然后继续到下一个专辑的目录.只需要用户干预某些错误.

任何帮助,将不胜感激.

Javascript不是我正在寻找的解决方案.我觉得这应该可以在PHP和ZF 1 MVC的构造中实现.

我这样做主要是为了我自己的启蒙,这似乎是学习一些重要概念的好方法.

[编辑]
好的,关于如何将其分解为更小的块的一些想法怎么样.处理一个块,提交,处理下一个块,一种事物.进出ZF.

[编辑]
我开始看到我正在努力完成的问题.似乎输出缓冲不仅仅发生在ZF中,它从ZF一直到浏览器都在发生.Hmmmmm ...

Bab*_*aba 7

介绍

这是你不应该做的典型例子,因为

  • 您正在尝试ID3 tag使用PHP 进行解析,这很慢并且尝试同时拥有多个解析文件肯定会使它更慢

  • RecursiveDirectoryIterator将加载文件夹和子文件夹中的所有文件从我看到没有限制..它可以是2,000今天的100,000第二天?总处理时间是不可预测的,在某些情况下肯定需要几个小时

  • 高度依赖单个文件系统,使用当前的体系结构,文件存储在本地系统中,因此很难分割文件并进行适当的负载平衡

  • 您没有检查之前是否已提取文件信息并且此结果 Loop and extraction Duplication

  • No locking system ..这意味着可以同时启动此过程,从而导致服务器上的性能普遍降低

解决方案1:使用当前架构

我的建议是不要批量使用loopRecursiveDirectoryIterator处理文件.

文件上载传输到服务器后立即定位.这样,您一次只能使用一个文件来分散处理时间.

解决方案2:作业队列(建议的解决方案)

您的问题正是Job Queue的目的所在,您也不仅限于使用...来实现解析 PHP...您可以利用 CC++提高性能

优点

  • 将作业转移到更适合工作的其他机器或流程
  • 它允许您并行工作,以进行负载平衡处理
  • 通过异步运行耗时的任务,减少大容量Web应用程序中页面视图的延迟
  • PHP服务器中的多语言客户端C

实例已经过测试

预期的流程客户端

  • 连接到作业队列,例如德语
  • 连接数据库,例如MongoDB或Redis
  • 循环与文件夹路径
  • 检查文件扩展名
  • 如果文件是mp3,则生成文件哈希例如.sha1_file
  • 检查文件是否已发送以进行处理
  • 将哈希,文件发送到作业服务器

预期的Process Server

  • 连接到作业队列,例如德语
  • 连接数据库,例如MongoDB或Redis
  • 接收哈希/文件
  • 提取ID3标签;
  • 使用ID3标记信息更新DB

最后,这个处理可以在多个服务器上并行完成