2

我正在以编程方式创建大约 150 个节点,并且在单个请求中完成所有操作时遇到“内存不足”错误。(我有一个菜单回调,它生成节点并在它们上调用 node_save() 。)

例子:

for($i=0; $i<150; $i++) {
    $node = new stdClass(); 
    $node->title="Foo $i";
    $node->field_myfield[0]['value'] = "Bar $i";
    ...
    node_save($node);
}

我听说过 BatchAPI,但从未使用过它。这是解决这个问题的正确工具吗?文档谈论超时,但不是内存问题。有没有更简单的东西我可能会错过?

4

2 回答 2

2

是的,Batch API 可以解决这个问题。它将您的内存使用分解为单独的 HTTP 请求,每个请求都可以访问您的全部内存限制。

于 2010-04-28T01:25:59.983 回答
0

你用过视图批量操作吗?( http://drupal.org/project/views_bulk_operations ) 它带有一个显示在 admin/content/node2 的捆绑视图,您可以对其进行编辑以启用“运行 PHP 代码”操作,以及打开 Batch API。这是以编程方式修改节点的最简单方法。

但是,由于您正在创建节点,因此您应该在指令末尾取消设置 $node ,它应该会降低您的内存使用量。尝试:

  for($i=0; $i 150; $i++) {
    $node = new stdClass(); 
    $node->title="Foo $i";
    $node->field_myfield[0]['value'] = "Bar $i";
    ...
    node_save($node);
    unset($node);
  }
}

于 2010-04-28T22:30:02.990 回答