致命错误:PHP内存不足

时间:2012-08-27 00:46:56

标签: php memory timeout

我不知道为什么昨晚工作正常,今天早上我正在接受

  

致命错误:内存不足(分配1611137024)(试图分配   1610350592字节)在/home/twitcast/public_html/system/index.php上   第121行

正在运行的代码部分如下

function podcast()
  {
            $fetch = new server();
            $fetch->connect("TCaster");
            $collection = $fetch->db->shows;

            // find everything in the collection
            $cursor = $collection->find();

            if($cursor->count() > 0)
            {
                $test = array();
                // iterate through the results
                while( $cursor->hasNext() ) {   
                    $test[] = ($cursor->getNext());
                }
                $i = 0;
                foreach($test as $d) {

                for ( $i = 0; $i <= 3; $i ++) {
                $url = $d["streams"][$i];   
                $xml = file_get_contents( $url );
                $doc = new DOMDocument();
                $doc->preserveWhiteSpace = false;
                $doc->loadXML( $xml); // $xml = file_get_contents( "http://www.c3carlingford.org.au/podcast/C3CiTunesFeed.xml")

                // Initialize XPath    
                $xpath = new DOMXpath( $doc);
                // Register the itunes namespace
                $xpath->registerNamespace( 'itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd');

                $items = $doc->getElementsByTagName('item');    
                    foreach( $items as $item) {
                        $title = $xpath->query( 'title', $item)->item(0)->nodeValue;
                        $published = strtotime($xpath->query( 'pubDate', $item)->item(0)->nodeValue);
                        $author = $xpath->query( 'itunes:author', $item)->item(0)->nodeValue;
                        $summary = $xpath->query( 'itunes:summary', $item)->item(0)->nodeValue;
                        $enclosure = $xpath->query( 'enclosure', $item)->item(0);
                        $url = $enclosure->attributes->getNamedItem('url')->value;

                    $fname = basename($url);
                    $collection = $fetch->db->shows_episodes;

                    $cursorfind = $collection->find(array("internal_url"=>"http://twitcatcher.russellharrower.com/videos/$fname"));
                    if($cursorfind->count() < 1)
                    {


                        $copydir = "/home/twt/public_html/videos/";
                        $data = file_get_contents($url);
                        $file = fopen($copydir . $fname, "w+");

                        fputs($file, $data);

                        fclose($file);
                        $collection->insert(array("show_id"=> new MongoId($d["_id"]),"stream"=>$i,"episode_title"=>$title, "episode_summary"=>$summary,"published"=>$published,"internal_url"=>"http://twitcatcher.russellharrower.com/videos/$fname"));

                        echo "$title <br> $published <br> $summary <br> $url<br><br>\n\n";
                    }




                }

            }
            }
            }

第121行是

$data = file_get_contents($url);

2 个答案:

答案 0 :(得分:0)

Memory Limit - 看看这个指令。假设这就是你需要的。

或者您可以尝试使用copy而不是将文件读取到内存(这是视频文件,据我所知,因此没有什么奇怪的,它需要大量内存):

$copydir = "/home/twt/public_html/videos/";
copy($url, $copydir . $fname);

看起来昨晚打开的文件较小)

答案 1 :(得分:0)

您想为单个PHP线程添加1.6GB的内存使用量吗?虽然你可以增加内存限制,但我的强烈建议是看看你想要的另一种方式。

可能是最简单的解决方案:您可以使用CURL来请求源文件的字节范围(对于远程文件,使用Curl比get_file_contents更明智)。您可以一次获得100K,写入本地文件,然后获得下一个100k并覆盖文件等,直到整个文件被拉入。

您也可以对流做一些事情,但它会变得更复杂一些。如果远程服务器不允许您按字节获取文件的一部分,这可能是您唯一的选择。

如果您的服务器具有权限,最后还有Linux命令,如wget,运行exec()。