2012-04-11 7 views
0

Ich arbeite an einer kleinen mobilen App-Version von www.sciencedaily.com. Nur ein kleines Nebenprojekt.es muss eine Möglichkeit geben, dieses PHP schneller zu machen

ich RSS_PHP bin mit dem XML-Feeds zu greifen, und der Code Ich habe aussieht (die großen Werke), wie dies vor dem 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(); 

Dann in den Inhalt, die ich Echo aus Ergebnisse mit klassischen Sachen wie

foreach($items as $item) { 

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

Wie gesagt, alles funktioniert wirklich gut. Aber es ist langsam als Hölle. Ich weiß, dass die Geschwindigkeit der App begrenzt sein wird, da sie die Feeds aufnehmen muss, aber es gibt keine Cache-Fähigkeit mit RSS_PHP, wie es bei SimplePie der Fall ist.

Irgendwelche Ideen zur Verbesserung der Geschwindigkeit? Vielleicht zuerst die Featured-Sachen laden, dann alles andere?

Vielen Dank im Voraus!

+1

Müssen Sie alle Feeds gleichzeitig laden? Sie können das Laden einfach aufschieben, bis der Benutzer sie anfordert, oder die Menge begrenzen, die jeder Feed anfänglich bereitstellt. Wenn Sie dann die Liste aktualisieren müssen, können Sie einfach eine AJAX-Anforderung an Ihren Server stellen und die Benutzeroberfläche bei Bedarf neu zeichnen. Alternativ könnten Sie immer noch anfangs alles laden, aber mit AJAX, dh: Entfernen Sie das oben erwähnte Lazy Loading. – Josh

+0

Wenn das funktioniert, gehört es zu http://codereview.stackexchange.com – Niko

+0

Ich kenne die API hier nicht, aber diese Elemente laden seriell oder parallel? Wenn healthMed nicht startet, bis featuredItems fertig ist, möchten Sie mehrere Threads erstellen, um das Problem zu beheben. Nicht so einfach in PHP. –

Antwort

0

Sie könnten:

  • irgendeine Form von Caching implementieren, wird dies auf jeden Fall helfen.
  • Vielleicht in Betracht ziehen, einige Ajax zu verwenden, wird die Seite schnell geladen, und die RSS werden eins nach dem anderen angezeigt, sobald sie in. Sind Sie möglicherweise auch in der Lage, mehrere Anrufe simmulanious auszuführen.
-1

Nach the documentation kann auch Daten von einem lokalen URI laden - warum Sie die Fernbedienung nicht holen Feeds in einem separaten Skript, sagen wir, alle 15 Minuten, und hier nur die lokalen Versionen laden? Es würde die Belastung auf dem Remote-Server und reduzieren Sie Ihre Bandbreitennutzung.

+0

Warum der Downvote, es ist ein stellarer Vorschlag (zu einem scheinbar sehr faulen OP) –

5

Verwenden Sie CURL library. Es gibt eine Option für mehrere Anfragen gleichzeitig. Alle Anfragen werden gleichzeitig parallel ausgeführt. Überprüfen Sie diesen Link zum Beispiel und Tutorial.

php curl parallel requests

aktualisieren

Suchen Sie nach Dokumentation über php_rss. Verwenden

$testRSS->loadRSS($res); //$Res is string data from Curl instead of url 
+0

Dies ist eine gute Möglichkeit, die URLs zu greifen, aber ich kann es nicht so in RSS_PHP übergeben: https://gist.github.com/ 2362136 – ggwicz

+0

@ggwicz aktualisierte Code – safarov

+0

Danke @savarov. Ich habe versucht, mit loadRSS und loadXML vor, keine Zigarre. – ggwicz

0

Implementieren Caching Server-Seite, hier ist ein Skript, das ich vor ein paar Jahren erstellt zurück (richtig je nach Bedarf):

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; 

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

Dann ziehen Die lokalen RSS-Feeds in Ihre PHP zu analysieren, ist Ihre Verzögerung beim Abrufen externer Quellen.

Wenn Sie das obige Skript auf einen CRON setzen, wird es mit der von Ihnen gewünschten Häufigkeit abgerufen. Genießen Sie!

+0

hey, danke für die Eingabe. Das sieht gut aus, aber ich bin nicht sicher, wie ich diese Daten erfassen und dann in meine Hauptindex.php-Datei einfügen würde. Trotzdem danke! – ggwicz

+0

Sie würden die Links, die Sie brauchen, in die 'urls.txt' Datei, die ich definiert habe, ändern, ändern Sie die' basedir' & 'storedir' an Ihren Standort, wo Sie Ihre RSS-Feeds aufrufen können. Sie speichern sie grundsätzlich lokal (und php öffnet die lokalen Dateien zum Lesen und Anzeigen, ohne dass Sie sie jedes Mal remote abrufen müssen). – Jakub

+0

Richtig, aber es gibt nicht buchstäblich eine URL, lokal oder remote, die ich in '$ testRSS-> load ('');'. Weißt du was gemein? – ggwicz

1

Ich werde versuchen, Sie mit der Verwendung von Threads zu beginnen. Ich verwende zur Verdeutlichung eine reduzierte Anzahl von RSS-Feeds.

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(); 
} 

Wohlgemerkt, ich habe nicht getestet, weil ich derzeit nicht eingerichtet, aber es gibt Ihnen die wichtigsten Komponenten. Wenn Sie auf Probleme stoßen, können Sie hier weitere Fragen stellen.

+0

toller Eingang, aber es funktioniert leider nicht :( – ggwicz

Verwandte Themen