从这里改道
该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 内有两个字段,一个是实体引用,另一个是文本字段)