2

首先,我知道这个问题:

我想知道的是,Gearman 还是这样吗?我计划将一批图像 URL 从 PHP Web 应用程序发送到 gearman 工作器(也是用 PHP 编写的;我们称之为“主工作器”)以进行异步处理。然后,该工作人员将为每个图像提交一个单独的任务(通过 addTask()),调用 runTasks() 并等待任务完成,同时侦听异常,累积错误消息并更新整体作业状态。

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

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

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

4

1 回答 1

3

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

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

于 2012-07-24T13:15:06.713 回答