在我的应用程序中,用户可以一次上传多张照片。
一旦这些被服务器接收到,就会发生以下情况:
- 安排了一个 Gearman 工人作业,该作业处理所有上传的图像,创建各种不同的裁剪尺寸并应用 Lancosz 过滤,然后最终将它们写入磁盘。根据上传照片的数量和分辨率,此过程最多可能需要 10 秒左右。
- 在主 PHP 线程中,数据库会更新以反映上传的图像。
尽管一切正常,但不能保证 Gearman 工作人员在数据库更新时已经完成。这意味着如果用户访问查询数据库以获取这些图像的页面,则他们可能会获得损坏的图像链接。
因此,我需要执行以下操作之一:
- 将我的数据库更新代码移动到 Gearman 工作器中,以便在图像处理完成后完成。
- 暂时,在 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 工作人员脚本在我的实际应用程序之外,那么我将如何从工作人员内部访问这些函数?
我知道从一个问题中可以提出很多问题,我希望我已经足够清楚地表达了这一点。任何帮助真的将不胜感激。