0

在我的应用程序中,用户可以一次上传多张照片。

一旦这些被服务器接收到,就会发生以下情况:

  • 安排了一个 Gearman 工人作业,该作业处理所有上传的图像,创建各种不同的裁剪尺寸并应用 Lancosz 过滤,然后最终将它们写入磁盘。根据上传照片的数量和分辨率,此过程最多可能需要 10 秒左右。
  • 在主 PHP 线程中,数据库会更新以反映上传的图像。

尽管一切正常,但不能保证 Gearman 工作人员在数据库更新时已经完成。这意味着如果用户访问查询数据库以获取这些图像的页面,则他们可能会获得损坏的图像链接。

因此,我需要执行以下操作之一:

  1. 将我的数据库更新代码移动到 Gearman 工作器中,以便在图像处理完成后完成。
  2. 暂时,在 PHP 主线程中,将完整大小的图像放置在所有位置,将完整大小的图像多次复制到各种不同的目录(“/assets/images/cropped/image.jpg”、“/assets/images/ thumbnail/image.jpg" 等)等待它们在稍后 Gearman 工作人员完成时被较小的裁剪和过滤版本覆盖。

出于显而易见的原因,解决方案 1 是最有意义的,尽管这当然有可能导致用户上传图像和他/她实际上能够在应用程序中查看它们之间的延迟。

因此,这实际上是一个 2-3 个问题:

  • 解决方案 1 或 2 是最好的方法,如果是,为什么?有没有更好的方法来管理我没有看到的这种情况?
  • 如果我使用解决方案 1,是否有办法管理因更新工作人员中的数据库而导致的潜在延迟?
  • 如果我选择使用解决方案 1,我会遇到一个问题,因为我对 PHP 中的面向对象编程比较陌生。如下所述:

如果我确实使用解决方案 1,我需要能够访问我的主应用程序数据库类和 memcached 类的公共函数,以及调用 Gearman 工作者本身的函数类,所有这些都来自 Gearman 工作者。

例如,在我的主应用程序中执行 MySQL PDO 数据库查询,$query = new Query($sql);然后绑定值并执行它等。在该文件的顶部use \App\Query,我可以访问这些公共函数。在其他情况下,我会从另一个函数中访问一个函数,但在同一个类中使用self::functionToPerform();Gearman 工作人员脚本在我的实际应用程序之外,那么我将如何从工作人员内部访问这些函数?

我知道从一个问题中可以提出很多问题,我希望我已经足够清楚地表达了这一点。任何帮助真的将不胜感激。

4

1 回答 1

1

How important is real-time upload/update images? Because if time for process images is ~10 sec., user can see notification about this. And as soon as images ready web-page will be updated.

I think workers for images processing must do just this job. You can create workers for DB updates. It's will be two types of workers which can communicate with a message queue (like a RabbitMQ).

And upload process will be looks like this:

  • User uploading his images
  • Image processing worker gets a task and do it
  • Image processing worker sends notify message in queue: 'Images ready!'
  • DB update worker gets this message and do updates
  • DB update worker sends notify message and main process update the page view

Ofcourse, if I right understand a problem...

于 2013-02-20T18:21:59.607 回答