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 );
يمكنك إدخال أي مسجل تريده طالما أنه يقوم بتطبيق 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.