从here
重新路由 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节点存在于哪个entityreference字段被引用。
update2:在搜索解决方案时,我找到了关于访问field_collection_item的link并进一步拆分了如下所示的语句
// 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();
消耗的时间大约为600ms,其中$ ref_wrapper是一个字段集合项。对于加载单个字段值需要花费大量时间的字段集合项是否存在问题(在field_collection_item中,两个字段中有一个是entityreference,另一个是textfield)