feed-io は、ニュース フィードを利用して提供するために構築された PHP ライブラリです。特徴は次のとおりです。
このライブラリは拡張性が高く、多くの状況に適応できるように設計されているため、ドキュメントで解決策が見つからない場合は、ディスカッションでお気軽に質問してください。
Composer を使用して、feed-io をプロジェクトの要件に追加します。
composer require debril/feed-io
フィードアイオ | PHP |
---|---|
4.x | 7.1+ |
5.0 | 8.0+ |
6.0 | 8.1+ |
feed-io 4 には PHP 7.1 以降が必要で、feed-io 5 には PHP 8.0 以降が必要です。すべてのバージョンはpsr/log
および PSR-18 準拠の HTTP クライアントに依存します。使用を続けるにはphp-http/guzzle7-adapter
必要になる場合があります。ロギングにはmonolog
を推奨します。 feed-io のログの処理に適したライブラリは Monolog だけではありません。代わりに PSR/Log 準拠のライブラリを使用できます。
Composer を使用して feed-io をインストールしたとします。コマンドライン クライアントを使用してターミナルからフィードを読み取ることができます。
./vendor/bin/feedio read http://php.net/feed.atom
feed-io は、インターネット経由でフィードを読み取り、独自のフィードを公開するように設計されています。そのメインクラスは 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 ();
}
最後にフィードを消費してからの新しいアイテムのみを取得する必要がある場合は、結果のgetItemsSince()
メソッドを使用します。
// 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 ();
}
必要に応じて、いくつかのフィルターを組み合わせて項目を除外することもできます。
// 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 ();
}
帯域幅を節約するために、feed-io は、次回フィードを読み取り、フィードから新しいアイテムを取得する必要がある時期を推定します。
$ 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 は、最初に過去 7 日間にフィードがアクティブだったかどうかを検出し、そうでない場合はスリープ状態であると見なすことで、次回の更新時間を計算します。スリーピーフィードの次回更新日も翌日の時刻に設定されます。フィードが眠くない場合は、平均間隔と中央値間隔をフィードの最終更新日に追加して使用し、結果を現在時刻と比較します。結果が将来の場合は、次回の更新時刻として返されます。いずれも将来にない場合、フィードはすぐに更新されると考えられるため、次の更新時刻は計算の瞬間から 1 時間後になります。
注: 更新フィードのスリーピーおよびクローズの固定遅延はResult::getNextUpdate()
引数を通じて設定できます。詳細については、「結果」を参照してください。
Web ページはヘッダーで 1 つ以上のフィードを参照できます。feed-io はそれらを検出する方法を提供します。
// 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 }" ;
}
または、feed-io のコマンドラインを使用することもできます。
./vendor/bin/feedio discover https://a-website.org
検出されたすべてのフィードが出力に表示されます。
// 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 );
FeedIoFeedIo::getPsrResponse()
を使用すると、 FeedIoFeedInstance
を PSR-7 の有効な応答に直接変換できます。
$ 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 ' );
新しい FeedIo インスタンスを作成するには、2 つの依存関係を挿入するだけで済みます。
// 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 );
標準出力に書き込むように構成された Monolog を使用した別の例:
// 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 );
PsrLogLoggerInterface
を実装している限り、任意の Logger を挿入できます。 Monolog もサポートしていますが、これが唯一のライブラリではありません: 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 );
6.0 以降、PST-18 準拠の HTTP クライアントをラップする汎用 HTTP アダプターが追加されました。
use CustomPsr18 Client as CustomClient ;
$ client = new Custom Adapter Http Client( new CustomClient ())
$ logger = new Psr Log NullLogger ();
$ feedIo = new FeedIo FeedIo ( $ client , $ logger );
ファクトリは feed-io 5.2 で非推奨となり、6.0 で削除されました。ファサードを直接インスタンス化し、必要な HTTP クライアントとロガー インターフェイスを渡します。
場合によっては、日付にタイムゾーンが含まれていないフィードを使用する必要があることがあります。ユースケースによっては、正確な値を取得するためにフィードのタイムゾーンを指定する必要がある場合があるため、 feed-io はその回避策を提供します。
$ feedIo -> getDateTimeBuilder ()-> setFeedTimezone ( new DateTimeZone ( $ feedTimezone ));
$ result = $ feedIo -> read ( $ feedUrl );
$ feedIo -> getDateTimeBuilder ()-> resetFeedTimezone ();
結果を取得した後は、必ずfeedTimezone
リセットしてください。そうしないと、すべてのフィードが同じタイムゾーンに配置されることになります。
feed-io のコードのほとんどは、Jetbrains の厚意により PHP Storm を使用して書かれました。