2013-06-25 3 views
3

Я пытаюсь прочитать rss сайта агентства новостей и получить несколько вариантов всех новостей для сохранения в моей базе данных. поэтому я использовал php-функции как file_get_contents или cURl, но для получения содержимого сайта и анализа его требуется около минуты, чтобы разделить те части новостей, которые я хочу.PHP file_get_contents медленный и возвращает 500 Internal Server Error

Это часть моего кода, который я получаю Datails новостей из RSS:

$rss = new DOMDocument(); 
$rss->load('http://isna.ir/fa/Sports/feed'); 
$feed = array(); 
foreach ($rss->getElementsByTagName('item') as $node) { 
    $item = array ( 
     'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 
     'category' => $node->getElementsByTagName('category')->item(0)->nodeValue, 
     'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 
     'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue, 
     ); 
    array_push($feed, $item); 
} 
$title = str_replace(' & ', ' & ', $feed[0]['title']); 
    $link = $feed[0]['link']; 
    $category = $feed[0]['category']; 
    $date = date('l F d, Y', strtotime($feed[0]['date'])); 

И в этой части я использую ссылку новости, чтобы получить фотографию из оригинальной страницы новостей:

$context = stream_context_create(array('http' => array('header'=>'Connection: close'))); 

$f = explode("news", $link); 
$photo_link = $f[0]. 'photo' .$f[1]; 

$ff = file_get_contents($photo_link, false, $context); 
$f1 = explode('<div class="news-image">', $ff); 
$f2 = explode('<h1', $f1[1]); 
$f3 = explode('href="', $f2[0]); 
$f4 = explode('">', $f3[1]); 
$image = $f4[0]; 

echo '<img src="' .$image. '"></img>'; 

И это результат большой части времени:

Warning: file_get_contents(http://isna.ir/fa/photo/92040301515/مدافع-تیم-ملی-آلمان-از-فوتبال-خداحافظی-کرد) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in /opt/lampp/htdocs/example8/reader.php 

Я тоже использовал функцию CURL, но не сильно лучший результат!

+0

Вы пробовали urlEncoding изображения URL-адрес запроса страницы? – tlenss

+0

если у вас '500 Internal Server Error', значит, файл не читается – bystwn22

+1

@ bystwn22 URL-адрес работает отлично! Вы могли бы протестировать его, прежде чем комментировать! – tlenss

ответ

2

попробовать это

<?php 
    $photo_link = explode("news", $link); 

    $first = $photo_link[0]; 
    $last = str_replace(basename($photo_link[1]), urlencode(basename($photo_link[1])), $photo_link[1]); 

    $photo_link = $first."news".$last; 
    print_r(file_get_contents($photo_link, false, $context)); 
?> 

так что ваш полный код будет что-то вроде этого

<?php 
    $feed = array(); 
    $rss = new DOMDocument(); 
    $rss->load('http://isna.ir/fa/Sports/feed'); 

    foreach($rss->getElementsByTagName('item') as $node) { 
    $feed[] = array(
     'title'  => str_replace(" & ", " &amp; ", $node->getElementsByTagName('title')->item(0)->nodeValue), 
     'category' => $node->getElementsByTagName('category')->item(0)->nodeValue, 
     'link'  => $node->getElementsByTagName('link')->item(0)->nodeValue, 
     'date'  => strtotime($node->getElementsByTagName('pubDate')->item(0)->nodeValue) 
    ); 
    } 

    $title = $feed[0]["title"]; 
    $link  = $feed[0]["link"]; 
    $category = $feed[0]["category"]; 
    $date  = date("l F d, Y", $feed[0]["date"]); 

    print_r($feed); 

    $context = stream_context_create(
    array(
     'http' => array(
     'header' => 'Connection: close' 
    ) 
    ) 
); 

    $f = explode("news", $link); 

    /** My Code Starts **/ 
    $f[1] = str_replace(basename($f[1]), urlencode(basename($f[1])), $f[1]); 
    /** My Code Ends **/ 

    $photo_link = $f[0]."photo".$f[1]; 

    $ff = file_get_contents($photo_link, false, $context); 
    $f1 = explode('<div class="news-image">', $ff); 
    $f2 = explode('<h1', $f1[1]); 
    $f3 = explode('href="', $f2[0]); 
    $f4 = explode('">', $f3[1]); 
    $image = $f4[0]; 

    echo '<img src="'.$image.'"></img>'; 
?> 
2

Try URL кодирующий арабский часть URL

$urlParts = explode('/', $f[1]); 
foreach ($urlParts as $idx => $urlPart) { 
    $urlParts[$idx] = urlencode($urlPart); 
} 

$photo_link = $f[0]. 'photo' . implode('/', $urlParts); 
var_dump(file_get_contents($photo_link)); 
+0

Поскольку $ f [1] имеет две части, одна из которых является арабской, теперь это проблема с первой частью $ f1 [1], что формат такой, как **/number/**. –

+0

**/** изменен на **% 2F ** с помощью функции urlencode()! –

+0

Попробуйте взорвать строку в/и закодировать последнюю часть – tlenss