2011-05-02 3 views
1

기본적으로 rss 피드를 읽고 사용자 정의 태그를 추가하여 XML을 만들려고합니다. 나는 내 코드가 들어있는 함수를 만들었고 이제는 다른 rss URL로 함수를 여러 번 호출하려고한다. 각 호출은 다른 .xml 파일을 생성합니다.
DOMDocument를 사용하여 rss 및 simple_html_dom을로드하고 구문 분석하여 각 rss 항목의 링크를로드하고 구문 분석하여 html에서 일부 내용을 가져옵니다.
여기 내 코드의 간단한 예입니다PHP가 이전 함수가 완료 될 때까지 대기합니다.

<?php 
include('simple_html_dom.php'); 
load_custom_rss('http://www.somesite.com/rssfeed/articles', 'articles.xml'); 
load_custom_rss('http://www.somesite.com/rssfeed/jobs', 'jobs.xml'); 
load_custom_rss('http://www.somesite.com/rssfeed/press', 'press.xml'); 
//up to 20 similar function calls here... 

function load_custom_rss($link, $filename){ 

    $doc = new DOMDocument(); 
    $doc->load($link); 

    $newDoc = new DOMDocument('1.0', 'UTF-8'); 

    $rss  = $newDoc->createElement('rss'); 
    $channel = $newDoc->createElement('channel'); 
    $newDoc->appendChild($rss); 
    $rss->appendChild($channel); 

    foreach ($doc->getElementsByTagName('item') as $node) { 

     //here is some code to read items from rss xml/write them to new xml document. 
     //Code missing for simplicity 

     //Next lines used to get some elements from the html of the item's link 
     $html = new simple_html_dom(); 
     html->load_file($node->getElementsByTagName('link')->item(0)->nodeValue); 
     $ret = $html->find('#imgId');  
    } 
    $newDoc->formatOutput = true; 
    $fh = fopen($filename, 'w') or die("can't open file"); 
    fwrite($fh, $newDoc->saveXML()); 
    fclose($fh); 

    unset($doc); 
    //unset ALL variables and objects created in this function... 
    //........ 

}//function end 
?> 

내 문제는 3 또는 기능 아파치의 4 호출이 심각한 오류를 발생 후 수 있도록 함수의 각 호출로, 메모리의 상당한 양을 소비한다는 것입니다 함수에서 생성 된 모든 변수와 객체를 설정 해제하더라도 스크립트는 memory_limit보다 큰 메모리를 소비합니다. 함수 호출을 1 또는 2로 줄이면 모든 것이 잘 동작합니다.
작동 방식이 있습니까? 각 함수 호출이 시작하기 전에 이전에 끝날 때까지 기다렸지 만 어떻게 할 수 있습니까?

누군가가 도와 줄 수 있기를 바랍니다. 사전에 감사합니다.

+0

아파치에서 실행해야합니까, 아니면 명령 줄에서 실행할 수 있습니까? 후자의 경우 시간과 메모리에 대한 엄격한 제한이 없습니다. –

답변

1

원하는 것은 PHP의 정상적인 동작입니다. 처음부터 끝까지 잘 작동합니다. 각 기능은 이전 기능이 끝날 때까지 대기해야합니다. 문제는 php.ini에서의 메모리 제한이라고 생각합니다. 파일을 열고 지시문을 검색하십시오 : memory_limit 필요에 맞게 파일 크기를 늘리십시오.

+0

안녕하세요 @faileN, 답해 주셔서 감사합니다 :) php.ini를 편집 할 수 없습니다.) – CrisDeBlonde

+0

ini_set 함수를 사용하여 메모리 사용을 변경할 수도 있습니다. 아마 그것이 허용됩니까? –

+0

PHP 코드에서 : ini_set ('memory_limit', '2048M');과 같이됩니다. –

1

당신은 $의 문서가 아니라 $ newDoc을 설정 해제하고, 그 함수의 끝에서

unset($newDoc); 

를 추가하려고합니다.

다른 사람들이 말했듯이 문제는 메모리가 누출되거나 메모리 제한을 초과한다는 것입니다. 이것은 이전 코드가 끝날 때까지 기다리는 것과는 아무런 관련이 없습니다. 스크립트를 호출 한 후 다시로드 있도록

다른 방법 즉, 별도의 요청으로 load_custom_rss() 각 통화를 보류 할 수

$i = $_GET['i']; 

if ($i==0) 
    load_custom_rss('http://www.somesite.com/rssfeed/articles', 'articles.xml'); 
elseif ($i==1) 
    load_custom_rss('http://www.somesite.com/rssfeed/jobs', 'jobs.xml'); 

... etc ... 

else 
    die("I'm done"); 

header("Location: myself.php?i=".($i+1)); 

가능성이 물론 다를 수 있는지 여부에 따라 것입니다 스크립트를 다시로드에 대한 귀하의 접근 방식 페이지는 먼저 HTML을 렌더링해야합니다.

+0

안녕하세요 @ 올리버, 답장을 보내 주셔서 감사합니다! 코드 예제에서는 $ newDoc 함수에서 생성 된 모든 객체의 설정을 해제합니다. 나는 모든 삽화를 단순화를 위해 코드에 넣지 않았다. 스크립트는 어떤 브라우저를 통해서도 실행되지 않으며 타사 응용 프로그램에 의해 트리거됩니다 (아약스는 생각합니다). 당신의 접근 방식이 어떤 식 으로든 달성 가능하다고 생각합니까? 그러면 스크립트가 실행될 때 자신을 호출 할 것입니다 (header()가 해결책이 아닙니다)? – CrisDeBlonde

+0

그게 더 어려울 수도 있지만 가능합니다. 나는 PHP가 'exec'를 통해 명령 행을 통해 여러 PHP '자식'스크립트를 호출하도록하기 전에 비슷한 것을했다. 그게 효과가 있지만 귀하의 호스팅 환경에 따라 약간 두통이 될 수도 있습니다. 우선'exec ("php ")'으로 스크립트를 호출 할 수 있는지 확인하십시오. –

관련 문제