【问题标题】:If I want to use native code to analysis in a web application, what should I do?如果我想在 Web 应用程序中使用原生代码进行分析,我应该怎么做?
【发布时间】:2010-11-22 16:05:13
【问题描述】:

问题来了...我要用户上传照片,用户上传照片后,我会有一些流程,分析这张照片的颜色是什么。但我不想在 php 上做... ...因为我有一个可以更快地运行它的 C 程序。另外,我不希望用户等待结果。当计算机分析它时,我会通知用户,并得到用户想要的结果。我该如何实施?有什么想法或建议吗?谢谢。

我的想法:

  1. 在数据库中写入一条记录,例如当用户上传成功时 file001.jpg,也做一个状态,对于 例如,状态:分析
  2. C 程序总是检查它是否有新的上传 数据库
  3. 如果有新上传,获取文件001.jpg
  4. C 程序完成分析后,更改中的状态 数据库,例如:完成
  5. 使用ajax的php程序,不断拉取数据库,检查 状态,如果状态更改为 “完成”,提示并告诉用户。

你觉得这个实现怎么样?

【问题讨论】:

  • 你要查看exec()

标签: php c system


【解决方案1】:

您的方法完全有效。本质上,您正在创建一个排队机制来将分析与上传分离。您的 Web 应用程序验证上传,然后返回给用户,已将条目写入数据库中的队列。

分析需要作为持续运行的守护程序运行,或者可能作为每 x 分钟/秒启动的 cron 作业运行。在设定的时间间隔内,它查看作业队列以查看是否有工作要做,如果有,它会处理它。完成后,您的守护程序会更新数据库以将作业标记为已完成,并且可能会将与分析相关的新数据写入不同的表中。

不要忘记,如果您在后台有多个处理守护进程,您还需要将作业标记为“已启动”,以免第二个进程最终重复该工作。

当用户返回页面时,会反映新的状态。这可以按照您的建议通过 Ajax 民意调查“实时”完成,或者您可以查看使用 Comet 方法保持实时连接打开 (http://en.wikipedia.org/wiki/Comet_%28programming%29)。

【讨论】:

    【解决方案2】:

    如果您不想使用 ImageMagick 或 GD,除非这些照片很大,否则您确实可以使用,那么您就在正确的轨道上。如果 C 程序足够快,您可以像 Pekka 所说的那样使用 exec() 在初始线程中立即运行 C 程序。

    我最近做了这个,检查一张照片的整体颜色以用于照片马赛克。我们用 GD 做到了这一点,而且非常简单。我们通过重新采样将图像缩小到 1 个像素,然后从中获取颜色。不是 100% 完美,但非常适合我们使用它的目的。

    【讨论】:

      【解决方案3】:

      Gearman [http://gearman.org/] 可能对您有用。

      Gearman 提供了一个通用的应用程序框架,可以将工作外包给其他更适合完成工作的机器或进程。它允许您并行工作、负载平衡处理以及在语言之间调用函数。

      它支持 C 和 PHP 等语言。您可以作为 Gearman 工作者在 C 中编写照片处理脚本。当 PHP 接收到文件上传时,您可以告诉 Gearman 守护程序来处理您的照片。然后,Gearman 守护程序将选择一个可用的工作人员来完成工作,并在您工作完成时通知您。

      这也将加快您的页面加载时间,因为客户端在将数据发送到他们的浏览器之前不必等待照片处理完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-20
        • 2019-10-13
        • 2023-02-21
        • 2011-08-12
        • 2020-05-24
        • 2016-06-25
        • 1970-01-01
        • 2011-04-30
        相关资源
        最近更新 更多