0

www.sciencedaily.com の小さなモバイル アプリ バージョンに取り組んでいます。ちょっとしたサイドプロジェクト。

私は RSS_PHP を使用して XML フィードを取得しています。私が持っているコード (これはうまく機能します) は、DOCTYPE の前に次のようになります。

require_once '_/rss_php.php';

$featuredRSS = new rss_php;
$healthMedRSS = new rss_php;
$mindBrainRSS = new rss_php;
$plantsAnimalsRSS = new rss_php;
$earthClimateRSS = new rss_php;
$spaceTimeRSS = new rss_php;
$matterEnergyRSS = new rss_php;
$compMathRSS = new rss_php;
$archaeoRSS = new rss_php;

$featuredRSS->load('http://www.sciencedaily.com/rss/top_news/top_science.xml');
$healthMedRSS->load('http://www.sciencedaily.com/rss/health_medicine.xml');
$mindBrainRSS->load('http://www.sciencedaily.com/rss/mind_brain.xml');
$plantsAnimalsRSS->load('http://www.sciencedaily.com/rss/plants_animals.xml');
$earthClimateRSS->load('http://www.sciencedaily.com/rss/earth_climate.xml');
$spaceTimeRSS->load('http://www.sciencedaily.com/rss/space_time.xml');
$matterEnergyRSS->load('http://www.sciencedaily.com/rss/matter_energy.xml');
$compMathRSS->load('http://www.sciencedaily.com/rss/computers_math.xml');
$archaeoRSS->load('http://www.sciencedaily.com/rss/fossils_ruins.xml');

$featuredItems = $featuredRSS->getItems();
$healthMedItems = $healthMedRSS->getItems();
$mindBrainItems = $mindBrainRSS->getItems();
$plantsAnimalsItems = $plantsAnimalsRSS->getItems();
$earthClimateItems = $earthClimateRSS->getItems();
$spaceTimeItems = $spaceTimeRSS->getItems();
$matterEnergyItems = $matterEnergyRSS->getItems();
$compMathItems = $compMathRSS->getItems();
$archaeoItems = $archaeoRSS->getItems();

次に、コンテンツでは、次のような古典的なものを使用して結果をエコーアウトしています

foreach($items as $item) {

    echo $item['title'];
}
etc...

私が言ったように、すべてが本当にうまくいきます。しかし、それは地獄のように遅いです。フィードを取得する必要があるため、アプリの速度に制限があることはわかっていますが、RSS_PHP には SimplePie のようなキャッシュ機能はありません。

速度を改善するためのアイデアはありますか?たぶん、最初に注目のものをロードしてから、他のすべてをロードしますか?

前もって感謝します!!

4

5 に答える 5

5

CURL ライブラリを使用します。同時に複数のリクエストを行うオプションがあります。すべてのリクエストは同時に並行して実行されます。例とチュートリアルについては、このリンクを確認してください。PHPカール並列リクエスト

アップデート

php_rssに関するドキュメントを探してください。使用する

$testRSS->loadRSS($res); //$Res is string data from Curl instead of url
于 2012-04-11T16:45:12.860 に答える
1

スレッドの使用を開始できるようにします。わかりやすくするために、少数の RSS フィードを使用しています。

require_once '_/rss_php.php';

public class loadFeeds(){

private int workers = 0;

private function launchWorker(&$feed, $url) {//NOTE: pass by reference!
  $pid = pcntl_fork();
  switch ($pid) {
  case -1: // fork failed
    $this->clog("ERROR: Worker fork failure. Running inline.");
    $feed->load($url);
    break;
  case 0: // child fork
    $feed->load($url));
    break;
  default: // parent fork?
    $this->workers++;
    echo "$this->workers launched.\n";
    break;
}

public function load() {
  $featuredRSS = new rss_php;
  $healthMedRSS = new rss_php;
  $mindBrainRSS = new rss_php;

  //Start some threads
  launchWorker($featuredRSS, 'http://www.sciencedaily.com/rss/top_news/top_science.xml');
  launchWorker($healthMedRSS, 'http://www.sciencedaily.com/rss/top_news/top_science.xml');
  launchWorker($mindBrainRSS, 'http://www.sciencedaily.com/rss/top_news/top_science.xml');

  $status = 0;
  while ($this->workers > 0) {//wait until all workers are done.
    while ($pid = pcntl_wait($status, WNOHANG OR WUNTRACED)) {//wait for a thread to report
      if ($pid > 0) { // if we have a valid pid 
        $this->workers--;//recover worker
      }
    }
  }

  $featuredItems = $featuredRSS->getItems();
  $healthMedItems = $healthMedRSS->getItems();
  $mindBrainItems = $mindBrainRSS->getItems();
}

注意してください、私は現在セットアップされていないので、これをテストしていませんが、主なコンポーネントを提供します. 問題が発生した場合は、ここで追加の質問を作成できます。

于 2012-04-11T21:02:12.660 に答える
0

サーバー側のキャッシングを実装します。これは私が数年前に作成したスクリプトです (必要に応じて修正してください)。

rss-fetch.sh:

#!/bin/bash
#------------------------------------------------------------------
#
# This script will run via CRONTAB and fetch RSS feeds from the
# urls.txt file, which can be used internally.  This way we minimize
# the number of requests externally for data.
#
# - created by Jakub - March 26 2008
#
#------------------------------------------------------------------

basedir=/htdocs/RSS
storedir=/htdocs/RSS/read/
sourcefile=/htdocs/RSS/urls.txt

#------------------------------------------------------------------
# Read the URLS.TXT file to get the URL/filename
#
# Formatted:
# http://rss.slashdot.org/Slashdot/slashdot/slashdot.xml
# ^- URL                    ^- filename to save as

for s in `cat "$sourcefile"`; 
    do  
        geturl=`dirname $s`;
        filename=`basename $s`;
        wget -qN $geturl -pO "$storedir"$filename;
done;

#------------------------------------------------------------------

次に、ローカルの RSS フィードを PHP にプルして解析します。遅延は外部ソースの取得にあります。

上記のスクリプトを CRON に設定すると、必要な頻度でフェッチされます。楽しみ!

于 2012-04-11T16:48:29.517 に答える
0

あなたは出来る:

  • なんらかの形式のキャッシングを実装してください。これはいずれの場合にも役立ちます。
  • おそらくいくつかの ajax を使用することを検討してください。ページは高速に読み込まれ、RSS は挿入されるとすぐに 1 つずつ表示されます。複数の呼び出しを同時に実行できる場合もあります。
于 2012-04-11T16:42:51.547 に答える
-1

ドキュメントによると、ローカル URI からもデータをロードできます。リモート フィードを別のスクリプトで、たとえば 15 分ごとに取得して、ここでローカル バージョンのみをロードしてみませんか? これにより、リモート サーバーの負荷が軽減され帯域幅の使用量が削減されます。

于 2012-04-11T16:45:04.657 に答える