jjzjj

php - 缩小大型处理作业

coder 2024-04-10 原文

这是我在寻找解决方案时使用的代码。

 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

  • 没有锁定系统 ..这意味着这个过程可以同时启动,导致服务器性能普遍下降

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

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

一旦文件上传传输 到服务器,就定位文件。这样一来,您一次只处理一个文件,这样可以分散处理时间。

方案二:作业队列(建议方案)

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

优势

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

例子已经测试

预期流程客户端

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

预期的进程服务器

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

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

关于php - 缩小大型处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322901/

有关php - 缩小大型处理作业的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    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

  2. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  3. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  4. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个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

  5. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

    我正在尝试解析网页,但有时会收到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这将打印状态码和正文。

  6. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

  7. ruby-on-rails - Rails 处理 .Erb 与 Nils - 2

    当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/

  8. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  9. ruby-on-rails - 如何在多个环境中处理 OmniAuth 回调? - 2

    我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l

  10. ruby - 脚本在命令行中成功执行但不是作为 cron 作业 - 2

    我有一个bash脚本,它运行一个ruby​​脚本来获取我的Twitter提要。##/home/username/twittercron#!/bin/bashcd/home/username/twitterrubytwitter.rbfriends命令行运行成功/home/username/twittercron但是当我尝试将它作为cronjob运行时,它运行了但无法获取提要。##crontab-e*/15*****/home/username/twittercron脚本已经chmod+x。不知道为什么会这样。有什么想法吗? 最佳答案

随机推荐