2017-12-08 4 views
0

오늘 모두 재미있게 보내세요.Javascript/PHP를 통해 RSS를보다 빨리 읽을 수 있습니다.

저는 다양한 RSS 피드에서 가져온 코드 중 가장 최근의 pubdate가있는 코드를 주문하는 작업 코드가 있습니다.

내가 가진 문제는 느리다는 것입니다. 사이트 로딩 속도가 느려집니다. 뿐만 아니라 모든 서버 측에서 호스팅되기 때문에 여러 사람이 사이트에 동시에 액세스하는 경우 응답 속도가 느려집니다.

그래서이 코드를 자바 스크립트 함수로 변환하면 태그의 innerHTML을 데이터베이스에서 다시 가져 오거나 다른 사람이 제안 할 수있는 다른 옵션으로 채울 수 있습니다 (빠른 경우). 더 작별없이

: 코드 : 끝에

PHP

function RSSFeeder() { 
    $client = buildCon(); 
    //Query removed, simply gets the RSS URL from the database 
    $query = ""; 
    $result = $client ->run($query); 
    $RSSList = array(); 
    foreach($result ->getRecords() as $record) 
    { 
     $ComicArray = array(); 
     $ComicName = $record ->value('Name'); 
     $RSS = $record ->value('RSS'); 
     $URL = $record ->value('URL'); 
     $content = file_get_contents($RSS); 
     $x = new SimpleXmlElement($content); 
     for ($i = 0; $i < 1; $i++) { 
      $profile = $x ->channel ->item[$i]; 
      $pubDate = $profile ->{ "pubDate"}; 
     } 
     $ComicArray['URL'] = $URL; 
     $ComicArray['Comic'] = $ComicName; 
     $ComicArray['pubDate'] = $pubDate; 
     $RSSList[] = $ComicArray; 
    } 

    #usort($RSSList, "sortFunction"); 
    usort($RSSList, "compareRSSTimes"); 

    return $RSSList; 
} 

, 당신은 아마도에 usort 방법을보고, 그래서 여기있다 : 거기에서

function compareRSSTimes($a, $b) { 
    $a = strtotime($a['pubDate']); 
    $b = strtotime($b['pubDate']); 

    if ($a == $b) { 
     return 0; 
    } 
    return ($a > $b) ? -1 : 1; 
} 

, 배열은 업데이트의 시간 순서에 따라 출력을 만드는 PHP 스크립트로 되돌려 보내집니다. 그것은 잘 작동합니다. 페이지를로드하는 데 약간의 시간이 걸리며 더 많은 사용자가 페이지에 액세스 할 때 내 테리브 서버의 지속 가능성에 대해 걱정합니다.

제안 사항?

+1

사용자가 페이지를 조회 할 때마다이 작업을 수행합니까? – IncredibleHat

+0

@Randall 예. 이것이 바로 문제입니다. 나는 이것을 고치는 방법에 대한 제안을 할 것이다. (참고, 내가 사용하고있는 데이터베이스에서 시간 제한 트리거를 설정할 수 없습니다. 지원되지 않습니다.) –

+1

서버에서 실행되고 정기적으로 URL을 폴링하는 스크립트가 있습니다. 결과를 구문 분석하고 작업 할 수있는 형식으로 데이터베이스에 저장하십시오. 매번이 쿼리를 실행하는 대신 데이터베이스에서 컨텐츠를 제공하십시오. 특정 URL 등을 호출하여 스크립트를 실행할 수있는 크론 작업을 설정하고 사람들이 귀하의 사이트를 방문 할 때 페이지로드에 영향을주지 않으면 서 트리거되도록 페이지에 자바 스크립트를 삽입하십시오. – miknik

답변

1

매일 한 번에 한 번씩이 작업을 수행하는 것이 좋습니다. 데이터베이스를 사용할 수 없으면 캐시 파일 저장소에 '무거운 비트'를 래핑하는 oldschool 방법을 사용하면 매우 빠르게 작업 할 수 있습니다.

그 예 :

function RSSFeeder() { 
    $cachefile = '/path/to/RSSList.json';// <- must be local server path, not a URL 
    if (filemtime($cachefile) < strtotime('now -1 minute')) { 
     // if stale, rebuild it 

     // .. do your normal building of the $RSSList here .. 

     file_put_contents($cachefile,json_encode($RSSList)); 
     return $RSSList; 
    } else { 
     // else output cache 
     return json_decode(file_get_contents($cachefile),true); 
    } 
} 

그것은 ... 더 우아하거나 같은 일을 정상 기능을 갖춘 라이브러리를 통해 부풀어를 사용할 수 있습니다.

그러나 이것은 작동합니다, 자기 수선, 호출 할 때만 cron 작업이 필요하지 않으며 db 연결을 열고 db를 쿼리하고 저장된 데이터를 출력하는 것보다 빠릅니다. 그러나 충분히 거대하지 않다. 그래서 당신의 선호도가 더 중요합니다.

+0

@Ranall 이것은 완벽 할 것입니다 비록 내가 30 분에서 1 시간 정도의 유효 기간을 거치지는 않았지만, 다음과 같이 구현하려고 시도했다. 스트림을 열지 못했다. HTTP 래퍼가 쓰기 가능한 연결을 지원하지 않는다. –

+0

허, 너는 넣고 있니? 파일을 원할 때 로컬 경로가 아닌 전체 URL 경로? (파일을 먼저 만들어야합니다.) IE : https://stackoverflow.com/questions/9748076/failed-to-open- http-wrapper-does-not-support-writeable-connections – IncredibleHat

+1

파일 가져 오기 문제가 발생했습니다 HTTP 문자열을 사용할 수 없으며 로컬 파일로 바뀌 었습니다 매력처럼 작동합니다 –

관련 문제