这是我在寻找解决方案时使用的代码。
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.
}
}
}
问题: 处理多个目录中的 mp3 文件的文件系统。将 id3 标签数据提取到数据库(3 个表),并将标签中的封面图像提取到单独的文件中。
我可以处理实际的提取和数据处理。我的问题是输出。
使用 Zend Framework 1.x 处理输出缓冲的方式,很难输出文件正在处理的指示符。在没有输出缓冲的旧式 PHP 脚本中,您可以在循环的每次迭代中打印出一些 html 并获得一些进度指示。
我希望能够处理每个专辑的目录,输出结果,然后继续到下一个专辑的目录。只需要用户干预某些错误。
如有任何帮助,我们将不胜感激。
Javascript 不是我正在寻找的解决方案。我觉得这在 PHP 和 ZF 1 MVC 的构造中应该是可能的。
我这样做主要是为了我自己的启发,这似乎是学习一些重要概念的好方法。
[编辑]
好的,关于如何将其分解成更小的 block 的一些想法怎么样。处理一个 block ,提交,处理下一个 block ,诸如此类。进出采埃孚。
[编辑]
我开始看到我正在努力完成的问题。似乎输出缓冲不仅仅发生在 ZF 中,它从 ZF 一直到浏览器无处不在。嗯……
最佳答案
这是你不应该做的事情的典型例子,因为
您正在尝试使用 PHP 解析 ID3 标记,这很慢,并且尝试同时拥有多个解析文件肯定会使它变得更慢
RecursiveDirectoryIterator 将从我看到的文件夹和子文件夹中加载所有文件,没有限制..今天可以是 2,000 100,000 第二天?总处理时间不可预测,在某些情况下这肯定需要几个小时
高度依赖单文件系统,在您当前的架构下,文件存储在本地系统中,因此很难拆分文件并进行适当的负载平衡
您没有检查之前是否提取过文件信息,这会导致Loop and extraction Duplication
没有锁定系统 ..这意味着这个过程可以同时启动,导致服务器性能普遍下降
我的建议是不要使用loop 或RecursiveDirectoryIterator 来批量处理文件。
一旦文件上传 或传输 到服务器,就定位文件。这样一来,您一次只处理一个文件,这样可以分散处理时间。
您的问题正是 Job Queue 的设计目的 您也不限于使用 PHP 实现解析 .. 您可以利用 C 或 C++ 提高性能
优势
PHP 中的多语言客户端 C 中的服务器 例子已经测试
预期流程客户端
预期的进程服务器
最终这个处理可以在多台服务器上并行完成
关于php - 缩小大型处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322901/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)
当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l
我有一个bash脚本,它运行一个ruby脚本来获取我的Twitter提要。##/home/username/twittercron#!/bin/bashcd/home/username/twitterrubytwitter.rbfriends命令行运行成功/home/username/twittercron但是当我尝试将它作为cronjob运行时,它运行了但无法获取提要。##crontab-e*/15*****/home/username/twittercron脚本已经chmod+x。不知道为什么会这样。有什么想法吗? 最佳答案