feed-io เป็นไลบรารี PHP ที่สร้างขึ้นเพื่อใช้และให้บริการฟีดข่าว มันมี:
ไลบรารีนี้สามารถขยายได้สูงและได้รับการออกแบบให้ปรับให้เข้ากับสถานการณ์ต่างๆ ได้ ดังนั้นหากคุณไม่พบวิธีแก้ไขผ่านเอกสารประกอบ อย่าลังเลที่จะถามในการสนทนา
ใช้ Composer เพื่อเพิ่ม feed-io ลงในข้อกำหนดของโครงการของคุณ:
composer require debril/feed-io
ฟีด-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
และไคลเอนต์ 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