如何在Gearman工作者中访问我的PHP应用程序公共功能?

时间:2013-02-19 20:23:52

标签: php gearman

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

服务器收到这些后,会发生以下情况:

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

虽然一切正常,但无法保证Gearman工作人员在数据库更新时已完成。这意味着如果用户访问向数据库查询这些图像的页面,则可能会损坏图像链接。

因此我需要做以下其中一项:

  1. 将我的数据库更新代码移动到Gearman工作人员中 图像处理完成后完成。
  2. 暂时,在主PHP线程中,将完整大小的图像放在所有位置,将完整大小的图像多次复制到各种差异目录中(“/assets/images/cropped/image.jpg”,“/ assets /images/thumbnail/image.jpg“等等”等待它们在Gearman工作人员完成后用较小的裁剪和过滤版本覆盖。
  3. 由于显而易见的原因,1号解决方案最有意义,但当然会有一个缺点,即可能导致用户上传图像之间出现延迟,并且他/她实际上能够在应用程序中查看它们。

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

    • 解决方案1或2是最好的方法,如果是这样,为什么?还有一种更好的方法可以解决这种我没有看到的情况吗?
    • 如果我使用解决方案1,无论如何都要管理因更新工作人员数据库而导致的潜在延迟?
    • 如果我选择使用解决方案1,我遇到了问题,因为我对PHP中的面向对象编程相对较新。如下所述:

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

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

    我知道从一个问题中可以提出很多问题,我希望我能够很好地阐述它。任何帮助真的很感激。

1 个答案:

答案 0 :(得分:1)

实时上传/更新图片有多重要? 因为如果过程图像的时间是~10秒,用户可以看到关于此的通知。一旦图像就绪网页将被更新。

我认为图像处理工作者必须完成这项工作。您可以为数据库更新创建工作程序。它将是两种可以与消息队列通信的工作者(如RabbitMQ)。

上传过程将如下所示:

  • 用户上传图片
  • 图像处理工作人员完成任务并执行此操作
  • 图像处理工作人员在队列中发送通知消息:'图像就绪!'
  • 数据库更新工作程序获取此消息并执行更新
  • 数据库更新工作程序发送通知消息,主进程更新页面视图

当然,如果我理解一个问题......