【问题标题】:Using drupal batch api with services将 drupal 批处理 api 与服务一起使用
【发布时间】:2010-01-27 05:53:00
【问题描述】:

我有一个 drupal 应用程序需要发布它的一些内容 - 有一个 flash wysiwyg 前端,它通过服务模块与 drupal 后端通信。 用户可以上传图像/视频,在 Flash 中放置和操作它们,完成后将导出静态版本。 作为此导出过程的一部分,应用程序需要对媒体元素进行一些处理 - 重新缩放等,因此我使用了批处理 api,因此它一次只处理元素以停止超时等等。 这大部分工作正常,但我对 batchapi 似乎工作的方式感到困惑。 我想做的是:

  1. flash 工具调用导出服务
  2. 导出服务创建一个代表此导出的节点,并返回一个 node_id
  3. 导出服务在后台触发导出,一旦完成,它会更改节点中的状态
  4. 同时,Flash 工具会轮询应用以查看发布何时完成,并通知用户。

目前似乎让我陷入困境的是在后台启动批处理,而不触发批处理在我调用 batch_process() 时所做的重定向事情,这样我就可以返回节点 ID 以闪烁并启动同时下批。

希望这是有道理的 - 有什么建议/想法吗?还是我做错了?

【问题讨论】:

    标签: drupal drupal-6


    【解决方案1】:

    不是 100% 确定(有一段时间没有使用批处理 API),但我现在看到 3 个选项:

    1. 使用您当前的工作流程并将批处理“init_message”设置为包含节点 ID 的内容:
      • 致电batch_process(),接受重定向。您的 Flash 应用需要遵循重定向,然后解析返回的页面以从显示的消息中提取节点 ID
      • 不过听起来很难看,因为您必须解析标准的批处理初始化页面:/
    2. 忘记轮询,让刷机工具等待结果:
      • 与选项 1 一样,您的 flash 工具需要能够处理批处理发出的重定向 - 您将启动批处理,将 $redirect_url 设置为将根据需要返回结果的页面Flash 应用。
      • 您的 Flash 应用程序遵循重定向,始终检查结果页面 - 一旦出现,它就使用它
      • 不知道这是否适合服务模块:/
    3. 在您的工作流程中拆分初始化:
      1. Flash 工具在“引导”URL 上调用导出服务
      2. 导出服务创建节点并返回节点 ID(此处未启动批处理!)
      3. Flash 工具检索节点 ID 并在“进程”URL 上调用导出服务,并传递节点 ID
      4. 导出服务使用传递的节点 ID 来启动实际的批处理(创建批处理并调用 batch_process())
      5. ...按照原始工作流程(轮询等)继续

    最后一个版本似乎是最简单/最干净的版本,代价是需要额外请求启动整个事情,这在您的场景中听起来像是一个小问题。


    编辑:

    • 选项 3 的变体可能是让初始导出服务(创建节点的服务)通过 drupal_http_request() 本身调用批处理初始化页面,然后将节点 ID 返回到 Flash 应用程序。相同的基本思想(将初始请求拆分为一个创建节点和另一个启动批处理),但从 Flash 应用程序的“角度”来看,它更加自包含,因为它不必通过两个单独的调用来触发处理。李>

    【讨论】:

    • 你给了我一些线索,我想,但我仍然需要一段时间才能理解它。这里有一些关于将批处理设置为非渐进式的内容:drupal.org/node/638712 但不确定我是否完全明白。
    • 但在这种情况下,非渐进式批处理对我没有用。人力资源管理。
    • 是的 - 如果我正确理解 batch_process() 和 _batch_process() 中的代码,将 $batch['progressive'] 设置为 FALSE 只会导致批处理一次性处理,从而失去避免超时。
    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多