0

从这里改道

concat.=$concat .= $ref_wrapper->$er_field_mac_id->nid->value();行正在消耗更多时间来执行。这是显而易见的还是有其他可能导致这种行为的东西。

我在做什么?
1.迭代字段集合项,因为它是一个多值字段
2.遍历field_collection项中的字段以获取机器名称以_list_er结尾的字段(这是一个实体引用字段)
3.一旦机器名称发现中断并且不输入第二个再次循环
4 继续外循环并设置 $concat 变量

为什么要循环获取机器名称?
我不希望它像 field_item_list_er 那样硬编码,因为应该将相同的片段应用于以tith_list_er 结尾的不同字段。前任。field_tv_list_er,field_favteam_list_er。

timer_start('get_loop_time');
foreach ($wrapper->$list_mac_id->getIterator() as $delta => $ref_wrapper) {
    if (!isset($er_field_mac_id)) {
        foreach ($ref_wrapper->getIterator() as $in_fci) {
            $in_fci = $in_fci->info();
            if (is_array($in_fci)) {
                if (is_array($in_fci) && isset($in_fci['type']) && $in_fci['type'] == 'node' && preg_match(
                        "/_list_er\z/i",
                        $in_fci['name']
                    )
                ) {
                    $er_field_mac_id = $in_fci['name'];
                    break 1;
                }
            }
        }
    }
    //following statement consuming from ~600ms to ~750ms for each iteration(currently only 2)
    timer_start('get_single_time');
    $concat .= $ref_wrapper->$er_field_mac_id->nid->value();
    dpm(timer_read('get_single_time'));
}
//so then total is from ~1200ms to ~1400 ms  (includes for loop)
dpm(timer_read('get_loop_time'));

更新:道歉:(由于缺乏信息,现在更新了详细信息。还有> 10000个节点存在于引用的实体引用字段。

update2:在寻找解决方案时,我找到了有关访问 field_collection_item的链接,并进一步拆分了如下语句

// Load that field collection item
$field_collection_item_value = $ref_wrapper->value();

// Wrap it with Entity API
$collection = entity_metadata_wrapper('field_collection_item', $ref_wrapper);

$val = $collection->{$er_field_mac_id}->value()->nid;

从上面的代码可以发现,语句$field_collection_item_value = $ref_wrapper->value();每次迭代都消耗更多的时间,大约 600 毫秒,其中 $ref_wrapper 是一个字段集合项。字段集合项是否有问题需要花费大量时间来加载单个字段值(在 field_collection_item 内有两个字段,一个是实体引用,另一个是文本字段)

4

0 回答 0