我有这个带有10,000条记录的源和一个循环来获取所有产品,然后使用这些列创建产品数组。
为每个零售商创建的地图不同,因此产品名称可以是产品的名称,也可以是Feed的两列。以下是一个例子。
我面临的问题是,在eval,eval,eval之后的每个循环......它开始疯狂地增加时间。即使根本没有任何功能。
Eval正在创建参考?功能 ?临时变量?有没有办法重置所有这些?
调试时间
[2014-05-14 10:21:08] [DEBUG]转换了500件商品在0.48338389396667内存使用情况:247750752阅读/总数:500/108640
(...)
[2014-05-14 10:26:06] [DEBUG]转换了500件产品在6.9182150363922内存使用情况:247751288阅读/总计:50000/108640
(...)
[2014-05-14 10:28:03] [DEBUG]转换了500件产品在7.5416939258575内存使用情况:247749704阅读/总数:60000/108640
示例
对于商家A我正在使用此php函数获取产品名称:
array_explode(",",str_replace(" ","",$NAME))[0];
所以我的映射$ v将有一个索引“f”,其后跟值为:
array_explode(",",str_replace(" ","",$NAME))[0];
在我执行该地图的评估之后
foreach($map as $k=>$v) {
(...)
$value = eval('return ' . $v["f"] . ";");
(...)
}
这很好用我得到的所有产品数组都很好,但这会让我的脚本执行时间变得越来越疯狂。如果我拿走那个,脚本会以每500行/产品0.4秒的速度运行罚款。
我需要eval,因为我使用php代码来解析/设置Feed的样式。
帮助? :)
答案 0 :(得分:0)
foreach($map as $k=>$v) {
(...)
$value = eval('return ' . $v["f"] . ";");
(...)
}
你不能从{fore} return
来。你可以假设 1。你在一个函数或方法中而 2。只会返回第一个结果,因为在return
之后它会破坏循环。
如果我弄错了,它也没有意义,你为什么不:
$value = $v["f"];
<强>更新强>
根据您的评论,$v["f"]
是一项功能,请使用call_user_func
代替eval
:
$value = call_user_func($v["f"]);
答案 1 :(得分:0)
甚至羞于说......是我的错!没问题,我只是用-d xdebug.remote.autostart = 1运行它,每个eval都打开一个xdebug。
抱歉:(感谢您的帮助!