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 ...
这是你不应该做的典型例子,因为
您正在尝试ID3 tag使用PHP 进行解析,这很慢并且尝试同时拥有多个解析文件肯定会使它更慢
RecursiveDirectoryIterator将加载文件夹和子文件夹中的所有文件从我看到没有限制..它可以是2,000今天的100,000第二天?总处理时间是不可预测的,在某些情况下肯定需要几个小时
高度依赖单个文件系统,使用当前的体系结构,文件存储在本地系统中,因此很难分割文件并进行适当的负载平衡
您没有检查之前是否已提取文件信息并且此结果 Loop and extraction Duplication
No locking system ..这意味着可以同时启动此过程,从而导致服务器上的性能普遍降低
我的建议是不要批量使用loop或 RecursiveDirectoryIterator处理文件.
将文件上载或传输到服务器后立即定位.这样,您一次只能使用一个文件来分散处理时间.
您的问题正是Job Queue的目的所在,您也不仅限于使用...来实现解析 PHP...您可以利用 C或C++提高性能
优点
PHP服务器中的多语言客户端C 实例已经过测试
预期的流程客户端
预期的Process Server
最后,这个处理可以在多个服务器上并行完成