PHP file_get_contents работает медленно и возвращает 500 Internal Server Error
Я пытаюсь прочитать rss сайта информационного агентства и получить несколько вариантов всех новостей для сохранения в моей базе данных. поэтому я использовал функции php как file_get_contents или cURl, но это занимает около минуты, чтобы получить контент сайта и проанализировать его для отделения тех частей новостей, которые я хочу.
Это часть моего кода, которую я получаю из новостей от 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, но результат получился не намного лучше!
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( " & ", " & ", $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>';
?>
Попробуйте 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));