2014-05-14 3 views
0

이 피드에는 10,000 개의 레코드가 있고이 모든 피드를 가져 와서 해당 열을 사용하여 제품 배열을 만드는 루프가 있습니다.Eval - 각 루프에서 시간 실행이 미친 듯이 증가합니다.

지도가 각 소매 업체마다 다르게 생성되므로 제품 이름은 제품 이름이거나 피드의 두 열일 수 있습니다. 아래는 그 예입니다.

내가 직면하고있는 문제는 각 루프가 eval, eval, eval ...을 수행 한 후부터 시작된다는 것입니다. 기능이 전혀없는 경우에도.

Eval에서 참조를 만들고 있습니까? 기능? 임시 변통? 거기에 그 모든 것을 재설정하는 방법? 247750752 읽기/총 :

DEBUG 시간은

[2014년 5월 14일 10시 21분 8초은] [디버그] 0.48338389396667 메모리 사용 500 개 제품을 변환 108,640분의 500

(.. . 247,751,288 읽기/총 : 108,640분의 50,000

(...)

,691,363)

는 [2014년 5월 14일 10시 26분 6초은] [디버그] 6.9182150363922 메모리 사용 500 개 제품을 변환 247749704 읽기/총 :210

는 [2014년 5월 14일 10시 28분 3초은] [디버그] 7.5416939258575 메모리 사용 500 개 제품을 변환 상인 A의 108,640분의 60,000

array_explode(",",str_replace(" ","",$NAME))[0]; 
,536 :

array_explode(",",str_replace(" ","",$NAME))[0]; 

그래서 내 매핑 $ (V)가 추적 값을 사용하여 인덱스 "F"를해야합니다 :이 PHP 함수와 제품 이름을 얻고있다

내가 그지도

foreach($map as $k=>$v) { 
    (...) 
    $value = eval('return ' . $v["f"] . ";"); 
    (...) 
} 

이 내가 내 모든 제품의 배열이 잘 얻을 잘 작동의 평가를 할 수 있지만,이 maddly 내 스크립트의 실행 시간을 증가 후. 이 스크립트를 사용하면 스크립트에서 500 라인/초당 0.4 초의 벌금이 부과됩니다.

피드를 구문 분석하거나 스타일을 지정하기 위해 PHP 코드를 사용하고 있으므로 eval이 필요합니다.

도움 말? :)

+0

주어진 코드는 충분하지 않다 어디에 메모리가 할당 이야기하고 어디 느린 얻을 시작할 수 있습니다. 그러나 우리가 말할 수있는 것은 솔루션을 평가하지 않고 적절한 자원 관리가 필요합니다. – DanFromGermany

+0

루프의 전체 소스 코드를 게시하는 데 신경 쓰지 않아도 될까요? –

+0

안녕하세요, 편집했습니다. 전체 루프가 필요하지 않습니다. 이미 루프가 정상적으로 작동하는지 테스트했습니다. –

답변

0
foreach($map as $k=>$v) { 
    (...) 
    $value = eval('return ' . $v["f"] . ";"); 
    (...) 
} 

foreach에서 return을 입력 할 수 없습니다. 하지만 그럴 수 있습니다 당신은 함수 또는 메서드 안에 있고 2.return 이후에 루프가 깨지기 때문에 첫 번째 결과 만 반환됩니다.

$value = $v["f"]; 

업데이트 :, 당신의 의견에 따라, $v["f"] 함수입니다

, 사용, 나는이 잘못을받을 경우

, 그것은 왜 그렇지, 중 이해가 나던 call_user_func 대신 eval는 :

$value = call_user_func($v["f"]); 
+0

귀하의 의견을 주셔서 감사합니다, eval 내게 그 기능을 가진 필드의 값을 반환합니다. 그 함수에 반환을 사용해야합니다, 각각에 대해 반환하지 않습니다, 그것은 할 일이 없다 foreach와 함께. 친숙한 예가 될 것입니다. –

+0

'$ v [ "f"]' – DanFromGermany

+0

안에 함수를 보여 주시겠습니까? 위의 예제에서 PHP는 몇 가지 PHP 함수이거나 심지어 Helper 클래스의 정적 함수 일 수 있습니다. 예 : Helper :: minPrice (array ($ rrp_price, $ discount_price)) –

0

그 말을하기조차 부끄러워은 ... 내 잘못! 그것으로 아무런 문제가 없었습니다. -d xdebug.remote.autostart = 1로 실행하고 각 평가에서 xdebug를 열었습니다. 당신이 청소기를 구현할 수있는 당신의 도움들에 대한

죄송합니다 :(감사합니다!

관련 문제