feed-io ist eine PHP-Bibliothek, die zum Konsumieren und Bereitstellen von Newsfeeds entwickelt wurde. Es verfügt über:
Diese Bibliothek ist hoch erweiterbar und so konzipiert, dass sie sich an viele Situationen anpassen lässt. Wenn Sie also in der Dokumentation keine Lösung finden, können Sie gerne in den Diskussionen nachfragen.
Verwenden Sie Composer, um Feed-Io zu den Anforderungen Ihres Projekts hinzuzufügen:
composer require debril/feed-io
Feed-io | PHP |
---|---|
4.x | 7.1+ |
5,0 | 8,0+ |
6,0 | 8.1+ |
Feed-io 4 erfordert PHP 7.1+, Feed-io 5 erfordert PHP 8.0+. Alle Versionen basieren auf psr/log
und jedem PSR-18-kompatiblen HTTP-Client. Um die Verwendung fortzusetzen, benötigen Sie möglicherweise php-http/guzzle7-adapter
. Es schlägt monolog
für die Protokollierung vor. Monolog ist nicht die einzige Bibliothek, die für die Verarbeitung von Feed-IO-Protokollen geeignet ist. Sie können stattdessen jede beliebige PSR/Log-kompatible Bibliothek verwenden.
Nehmen wir an, Sie haben Feed-io mit Composer installiert. Sie können dessen Befehlszeilen-Client verwenden, um Feeds von Ihrem Terminal zu lesen:
./vendor/bin/feedio read http://php.net/feed.atom
Feed-io wurde entwickelt, um Feeds im Internet zu lesen und eigene zu veröffentlichen. Seine Hauptklasse ist FeedIo:
// create a simple FeedIo instance, e.g. with the Symfony HTTP Client
$ client = new FeedIo Adapter Http Client ( new Symfony Component HttpClient HttplugClient ());
$ feedIo = FeedIo FeedIo ( $ client );
// read a feed
$ result = $ feedIo -> read ( $ url );
// get title
$ feedTitle = $ result -> getFeed ()-> getTitle ();
// iterate through items
foreach ( $ result -> getFeed () as $ item ) {
echo $ item -> getTitle ();
}
Wenn Sie nur die neuen Elemente seit der letzten Nutzung des Feeds abrufen müssen, verwenden Sie die getItemsSince()
-Methode des Ergebnisses:
// read a feed and specify the `$modifiedSince` limit to fetch only items newer than this date
$ result = $ feedIo -> read ( $ url , $ feed , $ modifiedSince );
// iterate through new items
foreach ( $ result -> getItemsSince () as $ item ) {
echo $ item -> getTitle ();
}
Sie können auch mehrere Filter kombinieren, um Artikel entsprechend Ihren Anforderungen auszuschließen:
// read a feed
$ result = $ feedIo -> read ( $ url , $ feed , $ modifiedSince );
// remove items older than `$modifiedSince`
$ since = new FeedIo Filter Since ( $ result -> getModifiedSince ());
// Your own filter
$ database = new Acme Filter Database ();
$ chain = new Chain ();
$ chain
-> add ( $ since )
-> add ( $ database );
// iterate through new items
foreach ( $ result -> getFilteredItems ( $ chain ) as $ item ) {
echo $ item -> getTitle ();
}
Um Bandbreite zu sparen, schätzt Feed-io, wann es das nächste Mal relevant sein wird, den Feed zu lesen und neue Elemente daraus zu erhalten.
$ nextUpdate = $ result -> getNextUpdate ();
echo " computed next update: { $ nextUpdate -> format ( DATE_ATOM )}" ;
// you may need to access the statistics
$ updateStats = $ result -> getUpdateStats ();
echo " average interval in seconds: { $ updateStats -> getAverageInterval ()}" ;
Feed-io berechnet die nächste Aktualisierungszeit, indem es zunächst erkennt, ob der Feed in den letzten 7 Tagen aktiv war. Wenn nicht, betrachten wir ihn als verschlafen. Gleichzeitig wird das nächste Aktualisierungsdatum für einen Sleepy-Feed auf den nächsten Tag gesetzt. Wenn der Feed nicht schläfrig ist, verwenden wir das durchschnittliche Intervall und das mittlere Intervall, indem wir diese Intervalle zum letzten Änderungsdatum des Feeds addieren und das Ergebnis mit der aktuellen Zeit vergleichen. Wenn das Ergebnis in der Zukunft liegt, wird es als nächste Aktualisierungszeit zurückgegeben. Wenn keiner davon in der Zukunft liegt, gehen wir davon aus, dass der Feed recht bald aktualisiert wird, sodass die nächste Aktualisierungszeit eine Stunde später ab dem Zeitpunkt der Berechnung liegt.
Bitte beachten Sie: Die festen Verzögerungen für schläfrige und geschlossene zu aktualisierende Feeds können über die Argumente Result::getNextUpdate()
festgelegt werden. Weitere Details finden Sie unter Ergebnis.
Eine Webseite kann in ihren Headern auf einen oder mehrere Feeds verweisen. Feed-io bietet eine Möglichkeit, diese zu entdecken:
// create a simple FeedIo instance, e.g. with the Symfony HTTP Client
$ client = new FeedIo Adapter Http Client ( new Symfony Component HttpClient HttplugClient ());
$ feedIo = FeedIo FeedIo ( $ client );
$ feeds = $ feedIo -> discover ( $ url );
foreach ( $ feeds as $ feed ) {
echo " discovered feed : { $ feed }" ;
}
Oder Sie können die Befehlszeile von feed-io verwenden:
./vendor/bin/feedio discover https://a-website.org
Sie erhalten alle erkannten Feeds in der Ausgabe.
// build the feed
$ feed = new FeedIo Feed ;
$ feed -> setTitle ( ' ... ' );
// convert it into Atom
$ atomString = $ feedIo -> toAtom ( $ feed );
// or ...
$ atomString = $ feedIo -> format ( $ feed , ' atom ' );
$ feed = new FeedIo Feed ;
$ feed -> setTitle ( ' ... ' );
$ styleSheet = new StyleSheet ( ' http://url-of-the-xsl-stylesheet.xsl ' );
$ feed -> setStyleSheet ( $ styleSheet );
// build the feed
$ feed = new FeedIo Feed ;
$ feed -> setTitle ( ' ... ' );
$ item = $ feed -> newItem ();
// add namespaces
$ feed -> setNS (
' itunes ' , //namespace
' http://www.itunes.com/dtds/podcast-1.0.dtd ' //dtd for the namespace
);
$ feed -> set ( ' itunes,title ' , ' Sample Title ' ); //OR any other element defined in the namespace.
$ item -> addElement ( ' itunes:category ' , ' Education ' );
// build the media
$ media = new FeedIo Feed Item Media
$ media -> setUrl ( ' http://yourdomain.tld/medias/some-podcast.mp3 ' );
$ media -> setType ( ' audio/mpeg ' );
// add it to the item
$ item -> addMedia ( $ media );
$ feed -> add ( $ item );
Sie können eine FeedIoFeedInstance
mit FeedIoFeedIo::getPsrResponse()
direkt in eine gültige PSR-7-Antwort umwandeln:
$ feed = new FeedIo Feed ;
// feed the beast ...
$ item = new FeedIo Feed Item ;
$ item -> set . . .
$ feed -> add ( $ item );
$ atomResponse = $ feedIo -> getPsrResponse ( $ feed , ' atom ' );
$ jsonResponse = $ feedIo -> getPsrResponse ( $ feed , ' json ' );
Um eine neue FeedIo-Instanz zu erstellen, müssen Sie nur zwei Abhängigkeiten einfügen:
// first dependency : the HTTP client
// here we use Guzzle as a dependency for the client
$ guzzle = new GuzzleHttp Client ();
// Guzzle is wrapped in this adapter which is a FeedIoAdapterClientInterface implementation
$ client = new FeedIo Adapter Guzzle Client ( $ guzzle );
// second dependency : a PSR-3 logger
$ logger = new Psr Log NullLogger ();
// now create FeedIo's instance
$ feedIo = new FeedIo FeedIo ( $ client , $ logger );
Ein weiteres Beispiel mit Monolog, das so konfiguriert ist, dass es auf die Standardausgabe schreibt:
// create a simple FeedIo instance, e.g. with the Symfony HTTP Client
$ client = new FeedIo Adapter Http Client ( new Symfony Component HttpClient HttplugClient ());
$ logger = new Monolog Logger ( ' default ' , [ new Monolog Handler StreamHandler ( ' php://stdout ' )]);
$ feedIo = FeedIo FeedIo ( $ client , $ logger );
Sie können jeden gewünschten Logger injizieren, solange er PsrLogLoggerInterface
implementiert. Monolog tut es, aber es ist nicht die einzige Bibliothek: https://packagist.org/providers/psr/log-implementation
use FeedIo FeedIo ;
use FeedIo Adapter Guzzle Client ;
use GuzzleHttp Client as GuzzleClient ;
use Custom Logger ;
$ client = new Client ( new GuzzleClient ());
$ logger = new Logger ();
$ feedIo = new FeedIo ( $ client , $ logger );
Seit 6.0 gibt es einen generischen HTTP-Adapter, der jeden PST-18-kompatiblen HTTP-Client umschließt.
use CustomPsr18 Client as CustomClient ;
$ client = new Custom Adapter Http Client( new CustomClient ())
$ logger = new Psr Log NullLogger ();
$ feedIo = new FeedIo FeedIo ( $ client , $ logger );
Die Factory ist in Feed-io 5.2 veraltet und wurde in 6.0 entfernt. Instanziieren Sie die Fassade direkt und übergeben Sie die gewünschte HTTP-Client- und Logger-Schnittstelle.
Manchmal müssen Sie Feeds konsumieren, in denen die Zeitzone in den Daten fehlt. In einigen Anwendungsfällen müssen Sie möglicherweise die Zeitzone des Feeds angeben, um einen genauen Wert zu erhalten. Feed-io bietet hierfür eine Problemumgehung:
$ feedIo -> getDateTimeBuilder ()-> setFeedTimezone ( new DateTimeZone ( $ feedTimezone ));
$ result = $ feedIo -> read ( $ feedUrl );
$ feedIo -> getDateTimeBuilder ()-> resetFeedTimezone ();
Vergessen Sie nicht, feedTimezone
zurückzusetzen, nachdem Sie das Ergebnis abgerufen haben, da sich sonst alle Feeds in derselben Zeitzone befinden.
Der größte Teil des Feed-io-Codes wurde mit freundlicher Genehmigung von Jetbrains mit PHP Storm geschrieben.