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, но результат не намного лучше!


person Mahmood Kohansal    schedule 25.06.2013    source источник
comment
Вы пробовали urlEncoding URL-адрес запроса страницы изображения?   -  person tlenss    schedule 25.06.2013
comment
если вы получили 500 Internal Server Error, это означает, что файл не читается   -  person bystwn22    schedule 25.06.2013
comment
@bystwn22 URL работает нормально! Вы могли бы на самом деле проверить это, прежде чем комментировать!   -  person tlenss    schedule 25.06.2013
comment
@tlenss да, URL-адрес страницы iamge правильный. если этот URL-адрес страницы изображения относится к URL-адресу страницы новостей, например, если URL-адрес страницы новостей isna .ir/fa/news/other URL страницы с изображением похож на isna.ir/fa/ фото/другое. Я использовал $f = взорвать(новости, $ссылка); $photo_link = $f[0]. 'фото' .$f[1]; для получения URL-адреса страницы изображения из URL-адреса страницы новостей.   -  person Mahmood Kohansal    schedule 25.06.2013
comment
Вы пробовали urlencode ($ photo_link)?   -  person tlenss    schedule 25.06.2013
comment
@tlenss Я отредактировал свой вопрос для вашего комментария.   -  person Mahmood Kohansal    schedule 25.06.2013
comment
Вы должны попробовать использовать SimplePie для анализа RSS-каналов. simplepie.org Он имеет систему кэширования, которая должна увеличить время загрузки вашего сайта.   -  person sodhancha    schedule 25.06.2013


Ответы (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>';
?>
person bystwn22    schedule 25.06.2013

Попробуйте 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));
person tlenss    schedule 25.06.2013
comment
Поскольку $f[1] состоит из двух частей, одна из которых арабская, теперь это проблема с первой частью $f1[1], формат которой похож на /number/. - person Mahmood Kohansal; 25.06.2013