2011-05-02 42 views
1

我想创建一些XML,基本上通过阅读rss提要,并添加到他们一些自定义标签。我做了一个包含我的代码的函数,现在我想用不同的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 
?> 

我的问题是,该函数的每个调用消耗的内存相当的量,所以之后的第三或功能的Apache 4调用抛出致命错误,如该脚本消耗的内存量大于memory_limit,即使我未设置该函数中创建的所有变量和对象。如果我减少1或2的函数调用一切正常。
有什么办法可以工作?我正在考虑每个函数调用在启动之前等待前一个完成,但是怎么做呢?

希望有人能帮助。 在此先感谢。

+0

这是否必须从apache运行,还是可以从命令行运行?如果是后者,则对时间和记忆没有如此严格的限制。 – 2011-05-02 12:28:03

回答

1

你想要的东西是在PHP中的正常行为。这是从上到下的工作。每个功能必须等待,直到前一个功能完成。我认为你的问题是php.ini中的内存限制。打开文件并搜索指令:memory_limit 增加它以符合您的需求。

+0

嗨@faileN,谢谢你回复:)我不允许编辑php.ini;) – CrisDeBlonde 2011-05-02 11:45:54

+0

你也可以使用ini_set函数来改变你的内存使用情况。也许这是允许的? – 2011-05-02 11:53:59

+0

这就是(在php代码中):'ini_set('memory_limit','2048M');'例如。 – 2011-05-02 14:13:28

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

你好@Oliver,谢谢你的回复! 正如我在我的代码示例中所说的,我也取消了在函数中创建的所有对象 - $ newDoc。为了简单起见,我没有在代码中放置所有的unset。 脚本不会通过任何浏览器运行,它会由第三方应用程序触发(通过我认为的阿贾克斯)。你是否认为你的方法在某种程度上是可以实现的,这样当脚本被触发时它会自己调用(header()不是这里的解决方案)? – CrisDeBlonde 2011-05-02 12:29:10

+0

这会更难,但可能。在我通过'exec'通过命令行调用多个PHP“子”脚本之前,我做了类似的事情。这有效,但取决于您的托管环境可能会轻微头痛。 看看你是否可以用'exec(“php ”)''为初学者调用你的脚本。 – 2011-05-02 22:08:49

相关问题