Gearman:是否仍然没有办法从后台工作人员检索自定义数据


Gearman: is there still no way to retrieve custom data from a background worker?

首先,我知道这个问题:

  • Gearman:从后台工作人员向客户端发送数据

我想知道的是,Gearman仍然是这样吗?我正计划将一批来自PHP web应用程序的图像URL发送给gearman worker(也是用PHP编写的;让我们称之为"the Main worker")以进行异步处理。然后,该工作程序将为每个映像向较低级别的工作程序提交一个单独的任务(通过addTask()),调用runTasks()并等待任务完成,同时侦听异常、累积错误消息并更新整体作业状态。

虽然我完全可以使用jobStatus()调用从Main Worker检索整体状态,但只要说当返回[false,false,0,0]时所有图像都已处理,我肯定需要能够通知用户,某些图像无法从他们各自的URL检索或存储在服务器上。

我想我总是可以把自定义数据存储在memcache中,然后从网络应用程序中检索,但对我来说它似乎"更脏"…

我不想得到任何结果,因为从我在php.net上的手册中看到的情况来看,即使是异常处理也只能在同步提交任务时完成,而没有提到自定义数据检索。我只是希望能有我错过的东西。我没有记错,我们使用的是带有libgearman6(v0.27)和PHP5.3.10的Ubuntu Server 12.04。gearman扩展的版本是1.0.2。我认为数据库在这里无关紧要,因为我不会在任何一个工人中使用它。我认为我们现在没有使用持久队列。

由于gearman在任务完成后不会在内存中保留任何任务信息(只需为同步任务报告它),如果不将其存储在第三方位置,您将无法在web应用程序中检索它。为此,我们通常在应用程序中使用一个简单的web服务,让工作人员在任务完成或发生错误时回调应用程序。这使我们能够保留在应用程序中发生此类错误时我们想做什么的业务逻辑,并让我们的工作人员更加通用(我们可能需要在许多应用程序中调整图像大小,但有些应用程序可能希望启动几个子任务,这些子任务取决于首先进行的图像大小调整)。

在编写时,您也可以让工作人员直接将任务状态写入数据库或memcached,但我发现,让应用程序本身处理逻辑,而不必更改,在特殊情况下,工作人员工作得更好。它也非常适合worker框架,允许您在实际worker代码中保持相同的标准化回调处理方式。