Feed-io — это PHP-библиотека, созданная для использования и обслуживания новостных лент. Он имеет:
Эта библиотека обладает широкими возможностями расширения и предназначена для адаптации ко многим ситуациям, поэтому, если вы не нашли решения в документации, не стесняйтесь спрашивать в обсуждениях.
Используйте Composer, чтобы добавить Feed-IO в требования вашего проекта:
composer require debril/feed-io
канал-io | PHP |
---|---|
4.х | 7.1+ |
5.0 | 8.0+ |
6.0 | 8.1+ |
Для Feed-io 4 требуется PHP 7.1+, для Feed-io 5 требуется PHP 8.0+. Все версии используют psr/log
и любой HTTP-клиент, совместимый с PSR-18. Чтобы продолжить использование, вам может потребоваться php-http/guzzle7-adapter
. он предлагает monolog
для ведения журнала. Monolog — не единственная библиотека, подходящая для обработки журналов Feed-IO. Вместо нее вы можете использовать любую библиотеку, совместимую с PSR/Log.
Предположим, вы установили Feed-io с помощью Composer. Вы можете использовать его клиент командной строки для чтения каналов с вашего терминала:
./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 дней, а если нет, мы рассматриваем его как сонный. Следующая дата обновления для сонного канала устанавливается на следующий день в то же время. Если фид не сонный, мы используем средний интервал и медианный интервал, добавляя эти интервалы к дате последнего изменения фида и сравнивая результат с текущим временем. Если результат находится в будущем, он возвращается как время следующего обновления. Если ни одного из них в будущем не будет, мы считали, что лента будет обновлена довольно скоро, поэтому следующее время обновления — через час с момента расчета.
Обратите внимание: фиксированные задержки для сонных и закрытых для обновления каналов можно установить с помощью Result::getNextUpdate()
, подробности см. в разделе «Результат».
Веб-страница может ссылаться на один или несколько каналов в своих заголовках, 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 );
Вы можете превратить FeedIoFeedInstance
непосредственно в действительный ответ PSR-7, используя FeedIoFeedIo::getPsrResponse()
:
$ 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, вам нужно всего лишь добавить две зависимости:
// 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 );
Вы можете внедрить любой Logger, который вам нужен, если он реализует PsrLogLoggerInterface
. 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 существует универсальный адаптер HTTP, который охватывает любой HTTP-клиент, совместимый с PST-18.
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 была написана с использованием PHP Storm, любезно предоставленного Jetbrains.