48K Views

تويتر API: جعل أفضل من الجري API

في الآونة الأخيرة كنت قد تأتي عبر مهمة تنفيذ تويتر تدفق واجهات برمجة التطبيقات العملية Twitter (تويت) في الوقت الحقيقي. وبشكل أكثر تحديدا, التطبيق أن يكون بناء أن تكون قادرة على الاستماع عن تويت تتراوح بين مواضيع متعددة المستخدمين (سوف نشير إليها كما المسارات) ، ينبغي أن يكون قادرا على الساخنة مبادلة هذه المسارات على الفور تقريبا.

ليس قبل وقت طويل من العمل على هذا التطبيق ، كان لإنجاز نفس المهمة في سياق Facebook. بدلا من تويتر, الأمر الذي يجعل من تدفق واجهات برمجة التطبيقات بتقديم تطبيقات مع تحديثات في الوقت الحقيقي, Facebook بدلا من ذلك يستخدم من Webhooks. Webhooks ، كونه HTTP رد ، توفر للمطورين مع مستوى التطور الذي هو أسهل بكثير للتعامل مع. تدفق واجهات برمجة التطبيقات التي توفرها تويتر ، ومع ذلك ، يتطلب التطبيق الخاص بك للحفاظ على استمرار HTTP اتصال مع واحد من تويتر العديد من تدفق النهاية. كتابة التطبيق الذي يعتمد على مثل اتصال مستمر هو عمل يتطلب منا التفكير في الأمر قليلا بطريقة مختلفة عما نحن من المفترض استخدامها أثناء بناء التقليدية ويب التطبيق.

كلها تركز هذه المادة على تطوير مثل هذا الطلب.

 

تويتر تدفق واجهات برمجة التطبيقات

إذا كنت نلقي نظرة على تويتر المطور الوثائق ، سترى أنها توفر لنا مع تدفق واجهات برمجة التطبيقات. بالطبع, كما أنها توفر لنا مع بقية الإعلانات واجهات برمجة التطبيقات كذلك, ولكن لدينا الأغراض المقصودة ، سوف يكون التركيز على تدفق واجهات برمجة التطبيقات.

ما هي بالضبط تدفق واجهات برمجة التطبيقات ؟ لوضعها في عبارات بسيطة ، وذلك باستخدام تدفق واجهات برمجة التطبيقات التطبيق الخاص بك يمكن إنشاء منخفضة الكمون اتصال مع تويتر تدفق النهاية. مرة واحدة تم تأسيس اتصال بنجاح, تويتر سوف ترسل إلى الأمام أي تغذية في الوقت الحقيقي التطبيق الخاص بك قد طلبت هذا الصدد خط أنابيب الفور تقريبا. وفقا مستندات:

يتدفقون واجهات برمجة التطبيقات تعطي المطورين الكمون المنخفض الوصول إلى تويتر العالمية تيار تغريدة البيانات. تطبيق سليم تدفق العميل سوف تكون دفعت رسائل تشير إلى التغريدات وغيرها من الأحداث قد وقعت دون أي من النفقات العامة المرتبطة الاقتراع بقية نقطة النهاية.

يتدفقون واجهات برمجة التطبيقات يتطلب قال الصدد أن تكون مستمرة (أساسا لا تنتهي) في الطبيعة. في جوهر, هو مماثل إلى تحميل عدد لا نهائي ملف النظام الخاص بك سوف تستمر في تلقي البيانات إلا إذا قمت يدويا إنهاء الاتصال.

نوع من الأعلاف يتلقى التطبيق الخاص بك سوف تعتمد على نوع من تيارات سوف تستخدم. تدفق واجهات برمجة التطبيقات يوفر للمطورين مع ثلاثة أنواع مختلفة من تيارات:

  • العامة تيارات – تيارات من البيانات العامة التي تتدفق من خلال تويتر. مناسبة المحددة التالية المستخدمين أو المواضيع ، واستخراج البيانات.
  • المستخدم تيارات – Single-user الجداول التي تحتوي على ما يقرب من جميع البيانات المقابلة مع مستخدم واحد وجهة نظر تويتر.
  • موقع تيارات – متعدد المستخدمين الإصدار المستخدم تيارات. الموقع تيارات تهدف للخوادم التي يجب الاتصال تويتر بالنيابة عن العديد من المستخدمين.

كما قلت سابقا ، الخلاصات التي نتلقاها سوف تعتمد على نوع من تيارات. حتى قبل أن نذهب إلى أبعد من ذلك ، دعونا نلقي نظرة على متطلبات التطبيق لدينا ، اعتمادا على سنكون باستخدام إما عامة تيارات أو المستخدم تيارات (الموقع تيارات في بيتا مغلقة).

لدينا التطبيق يجب تلبية المتطلبات التالية:

  • الاستماع إلى العيش تغريدات على المسارات طلبنا
  • تكون قادرة على معالجة تلقى تغريدات دون انقطاع اتصال مع تدفق نقطة
  • تكون قادرة على تبديل هذه المسارات كما أنها هي التي تغيرت مع أقل قدر من انقطاع وقال اتصال

حفظ هذه المتطلبات في الاعتبار, نحن الآن يجب أن يستقر على تيارات. المستخدم تيارات ، كما ذكر آنفا ، توفر البيانات من المستخدم الفردية من وجهة نظر. ووفقا تويتر وثائق المستخدم تيارات:

المستخدم توفير تيارات تيار من البيانات و الأحداث الخاصة مصادقة المستخدم. علما أن المستخدم تيارات لا تهدف خادم إلى خادم اتصالات. إذا كنت بحاجة إلى إجراء اتصالات نيابة عن العديد من المستخدمين في نفس الجهاز, النظر في استخدام الموقع تيارات.

تقليل عدد الاتصالات التطبيق الخاص بك يجعل المستخدم تيارات. كل حساب تويتر يقتصر على عدد قليل في وقت واحد مستخدم تيارات اتصالات في أوث التطبيق ، بغض النظر عن الملكية الفكرية. مرة واحدة في التطبيق تجاوز الحد أقدم الصدد سيتم إنهاء. حساب تسجيل الدخول من حالات كثيرة جدا من نفس أوث تطبيق دورة الاتصالات تطبيق حالات إعادة الاتصال و قطع الاتصال بعضها البعض.

منذ نحن أكثر تركيزا على أن تكون قادرة على الحصول على تويت من العديد من المستخدمين ، فإنه ليس من الواضح كيفية العديد من المستخدمين. تسير مستندات المستخدم تيارات لن قطع عليه لدينا التطبيق استخدام القضية. حتى الآن تبقى لدينا لجعل القيام مع الجمهور تيارات.

بدلا من المستخدم تيارات الذي يسمح لنا أن تتلقى الأعلاف في سياق محدود المستخدمين الفرديين العامة تيارات تقديم الطلبات مع تيار من البيانات العامة التي تتدفق من خلال تويتر. يتحدث في سياق تغريدات على وجه التحديد ، إذا استخدمنا العامة تيارات بذكاء ، لن تكون ملزمة نطاق محدود المستخدمين الفرديين على النقيض من المستخدم تيارات. وبما أننا لسنا بالضرورة بالقلق خاصة تيار من البيانات ، يمكننا أن يمر على طول يعالج تويتر (@اسم المستخدم) المقابلة الفردية مستخدمي تويتر على طول المسارات قبل تأسيس اتصال مع الجمهور تدفق نقطة النهاية. هذا سوف يتيح تطبيق الاستماع لايف العامة تويت من العديد من المستخدمين. سريعة نقطة إلى إشعار قبل أن نذهب إلى أبعد من ذلك ، كما في تويتر الوثائق العامة تيارات التطبيق لدينا يمكن فقط إنشاء اتصال واحد مع الجمهور تيارات في أي وقت معين.

 

التواصل مع تدفق API: بناء التطبيق لدينا

الآن بعد أن انتهينا من كل تمهيدية بت ، يمكننا البدء في بناء التطبيق لدينا. سوف يتم تطوير التطبيق في PHP يعمل على لينكس باستخدام شعبية Symfony إطار والملحن كما حزمة إدارة. أن يقال, يجب أن تكون قادرا على تطبيق المفاهيم الأساسية وتنفيذ المشروع في أي لغة من اختيارك.

ومع ذلك ، سيتم استخدام Phirehose Fennb, مكتبة طرف ثالث لتسهيل عملية التواصل مع تويتر تدفق واجهات برمجة التطبيقات. إذا كنت وضع على منصة أخرى من PHP, وهنا قائمة واسعة من مكتبات طرف ثالث يمكنك جعل استخدام من. يمكنك إضافة Phirehose إلى المشروع الخاص بك عن طريق الملحن باستخدام الأمر التالي:

php composer require “fennb/phirehose”

 

إعداد التطبيق:

إنشاء جديد Symfony المشروع (دعنا نسميها twitterFeeds) عن طريق تنفيذ الأمر التالي:

symfony جديدة twitterFeeds

قبل أن تتحرك جنبا إلى جنب مع المادة ، تأكد من أنك قمت بتثبيت مكتبة طرف ثالث كما ذكر أعلاه. بجانب إنشاء حزمة جديدة (دعونا نسمي هذا TwitterBundle) عن طريق تنفيذ الأمر التالي:

php بن/وحدة توليد:حزمة

اتبع جنبا إلى جنب مع أي تفاصيل التكوين يطلب منك. انتقل إلى TwitterBundle الدليل في المشروع الخاص بك و إنشاء جديد خدمات الدليل. في هذا الدليل ، إنشاء ملف جديد اسمه TwitterService.php التي سوف تستخدم. تأكد من تسجيل هذه الخدمة للتطبيق الخاص بك.

 

إنشاء اتصال مستمر:

كما قلت من قبل, كتابة التطبيق الذي يعتمد على اتصال مستمر هو عمل يتطلب منا التفكير في الأمر قليلا بطريقة مختلفة. خلافا لما حدث في حالة استخدام بقية واجهات برمجة التطبيقات ، حيث يمكننا إجراء مكالمات API أو Webhooks ، حيث رد إلى خدمتنا ، مع تدفق واجهات برمجة التطبيقات ، ونحن إنشاء اتصال مستمر مع تدفق نقطة النهاية ثم يعيش إلى الأبد (من الناحية المثالية) و العملية ما البيانات التي نتلقاها من جانبنا من خلال هذه الوسيلة. علينا إنهاء هذا الصدد إلا في الحالات عندما سوف تحتاج إلى إعادة تشغيل من أجل تحديث المسارات. كيف نذهب حول إنشاء مثل هذا قال الصلة ؟ طريقة واحدة لجعل استخدام العمليات الخلفية.

دعونا نقول أن علينا أن نستمع لايف تويت ، ثم نحن بحاجة إلى إنشاء اتصال مستمر مع تويتر العامة تدفق النهاية. كيف يمكن تنفيذ عملية خلفية عبر المحطة. هذه الخلفية عملية تشغيل عملية فردية ، سوف تنشئ قال استمرار الاتصال لدينا التطبيق يتطلب. ثم يمكننا تتبع معرف العملية (PID) هذه الخلفية العملية إذا نحن بحاجة إلى تغيير ذلك في أي شكل من الأشكال.

لجعل خلفية العملية سنقوم بإنشاء وحدة الأمر الذي يمكننا بعد ذلك من تنفيذ محطة في الدليل الجذر من المشروع. لجعل الأمر, يمكننا الاستفادة من عنصر تحكم التي تقدمها Symfony الإطار. أولا إنشاء القيادة الدليل في TwitterBundle ثم قم بإنشاء TwitterCommand.php ملف في هذا الدليل.

/**
 * Webkul Software.
 *
 * @category	Webkul, Uvdesk
 * @package		Webkul_UVDesk_TF
 * @author		Akshay Kumar
 * @copyright	Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
 * @license 	https://store.webkul.com/license.html
 */

namespace TwitterBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class TwitterCommand extends ContainerAwareCommand
{
	protected function configure()
	{
		$this->setName('twitter:stream')->setDescription('Listen for Live Twitter Feeds.');
	}

	protected function execute(InputInterface $input, OutputInterface $output)
	{
		$twitterTracks = ['#ReasonsToLoveMe']; // Define your tracks you wish to receive updates for
		$this->getContainer()->get('twitter.service')->listenForTweets($twitterTracks); // This will start the streaming process
	}
}

من الدليل الجذر من مشروعنا ، يمكننا الآن من تنفيذ قانون مكتوب داخل execute() وظيفة باستخدام الأمر التالي في الطرفية:

php بن/وحدة التحكم تويتر:تيار

كما يمكننا أن نرى ، TwitterCommand::execute() وظيفة في تحويل المكالمة TwitterCommand::listenForTweets() وظيفة محددة في TwitterService, والتي سوف إنشاء اتصال مستمر مع تويتر تدفق نقطة النهاية. لذلك دعونا رمز هذا. في TwitterService.php الذي أنشأنا في وقت سابق ،

/**
 * Webkul Software.
 *
 * @category	Webkul, Uvdesk
 * @package		Webkul_UVDesk_TF
 * @author		Akshay Kumar
 * @copyright	Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
 * @license 	https://store.webkul.com/license.html
 */

namespace TwitterBundle\Services;

const CONSUMER_KEY = YOUR_APP_CONSUMER_KEY;
const CONSUMER_SECRET = YOUR_APP_CONSUMER_SECRET;
const APPLICATION_TOKEN = YOUR_APP_ACCESS_TOKEN;
const APPLICATION_TOKEN_SECRET = YOUR_APP_ACCESS_TOKEN_SECRET;

// Include the third-party library
require_once __DIR__ . '/../../../vendor/fennb/phirehose/lib/OauthPhirehose.php';

class TwitterListener extends \OauthPhirehose
{
    public function __construct() {
        parent::__construct(APPLICATION_TOKEN, APPLICATION_TOKEN_SECRET, \Phirehose::METHOD_FILTER);
        $this->consumerKey = CONSUMER_KEY;
        $this->consumerSecret = CONSUMER_SECRET;
    }

    public function enqueueStatus($status)
    {   
        $twitterFeed = json_decode($status, true);
        if (is_array($twitterFeed) && isset($twitterFeed['user']['screen_name'])) {
            $twitterData = array('feed' => $twitterFeed);
            dump('New Feed Recieved');
            dump($twitterData);
        }
    }
}

class TwitterService
{
	/**
	 * This function will establish a persistent connection with one of the twitter's streaming endpoint.
	 * @param  array  $twitterTrackCollection Collection of tracks which we'll receive updates for
	 */
	public function listenForTweets(array $twitterTrackCollection = [])
    {
    	// Terminate the process if there are no active tracks
    	if (empty($twitterTrackCollection)) {
    		echo 'No active tracks. Terminating Process...' . PHP_EOL . PHP_EOL;
    		exit(0);
    	}

    	$twitterListener = new TwitterListener();
        $twitterListener->setTrack($twitterTrackCollection);
        $twitterListener->consume();
    }
}

الآن إذا كنت تنفيذ الأمر خلقنا فقط من محطة الخاص بك ، اتصال جديد مع تويتر API تدفق وسيتم إنشاء سوف تبدأ في تلقي الجمهور تغريدات عن المسارات المحددة. في وقت كتابة هذا المقال ، “#ReasonsToLoveMe” كانت تتجه لذلك كنت مثالا على ذلك المسار. الآن كل تغريدة يتم الذي يتكون من أي من المسارات المحددة (في هذه الحالة, “#ReasonsToLoveMe”) ، التي تغرد سيتم تمريرها إلى أسفل على طول اتصال الأنابيب. هذه التغريدة ثم يتم تمريرها على طول TwitterListener::enqueueStatus() وظيفة ، حيث يمكنك أن عملية تلقى تغذية. بيد أن يجب تجنب القيام بأي وقت-عملية مكثفة في هذه المرحلة. ولهذا إذا كان التطبيق الخاص بك هو غير قادر على معالجة هذا تيار من البيانات بسرعة كافية على النقيض من معدل أنت تلقي يغذي في, هل خطر وجود اتصال إنهاء التي سوف تكون غير مرغوب فيها.

في الوقت الحقيقي يغذي تويتر

في الوقت الحقيقي يغذي تويتر

حتى الآن, لقد تم يدويا بدء تشغيل اتصال عن طريق الذهاب إلى محطة تنفيذ الأمر. ولكن منذ تطبيقات العالم الحقيقي هي مختلفة كثيرا, دعونا أتمتة هذه العملية من بدء إغلاق الاتصال. في DefaultController دعنا كتابة عمل معالج )ندعو هذا startStreamActionم>) ، عندما أعدم ستبدأ لدينا تدفق العملية. تأكد من تكوين مسار هذا المعالج في المقابلة التوجيه.yml الملف. في DefaultController.php

/**
 * Webkul Software.
 *
 * @category	Webkul, Uvdesk
 * @package		Webkul_UVDesk_TF
 * @author		Akshay Kumar
 * @copyright	Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
 * @license 	https://store.webkul.com/license.html
 */

namespace TwitterBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    // .....

    /**
     * This handler will switch to the root directory and start a new background process
     */
    public function startStreamAction(Request $request)
    {
        chdir('../');
        $command = 'php bin/console twitter:listen';
        exec($command);
        exit(0);
    }

    // .....
}

الآن في كل مرة نزور طريق هذا المعالج سيتم تنفيذ الأمر بشكل منفصل في موضوع جديد.

مع الجمهور تيارات نحصل فقط على العامة يغذي للحصول على المسارات التي حددناها قبل تأسيس اتصال مستمر مع تدفق نقطة النهاية. حتى إذا دعت الحاجة إلى تحديث المسارات, سوف تحتاج إلى إنهاء الاتصال السابق ، إعادة تحديد المسارات لدينا ، ومن ثم إعادة إنشاء اتصال جديد مع تدفق نقطة النهاية. هذه العملية هي حرجة للغاية لأننا يمكن أن يكون واحد فقط اتصال مع تدفق نقطة النهاية في الوقت (ونحن خطر وجود IP المحظورة مع اتصالات متعددة). لذلك نحن بحاجة للتأكد من أن قبل محاولة إنشاء اتصال جديد, كل ما سبق عقد اتصالات مغلقة.

إغلاق اتصال مع تدفق نقطة النهاية يمكننا إنهاء عملية الخلفية المقابلة الاتصال. قتل العملية ، يمكننا أيضا الاستفادة من معرف العملية (PID) ، أو البحث عنه باستخدام اسم حجج خلفية العملية. باستخدام معرف العملية في كل مرة نقوم بإنشاء اتصال جديد, سوف تحتاج إلى تسجيل الدخول (قاعدة بيانات من ملف نصي ، الخ…) معرف العملية المقابلة إلى أن خلفية العملية. باستخدام هذا السجل ، ثم يمكنك إنهاء أي سابقا العمليات الخلفية قبل بدء واحدة جديدة. دعونا تحديث startStreamAction معالج تسجيل معرف العملية في كل مرة يتم الاتصال في DefaultController إنشاء عمل جديد معالج (دعونا نسمي هذا stopStreamAction) لإنهاء أي سابقا العمليات الخلفية. يمكن أن نسميها هذا المعالج قبل أن نبدأ خلفية جديدة عملية لضمان أن حالة واحدة فقط من اتصال مستمر مع تدفق نقطة النهاية نشطة في وقت واحد.

/**
 * Webkul Software.
 *
 * @category	Webkul, Uvdesk
 * @package		Webkul_UVDesk_TF
 * @author		Akshay Kumar
 * @copyright	Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
 * @license 	https://store.webkul.com/license.html
 */

namespace TwitterBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class DefaultController extends Controller
{
    // ......

    /**
     * This handler will first terminate any previously held background process  
     * by firing the stopStreamAction() handler. Then it'll create a new background  
     * process which establish a new connection with a streaming endpoint.
     */
    public function startStreamAction(Request $request)
    {
    	// Execute the stopStreamAction() handler
        $curlHandler = curl_init();
        $stopStreamPath = $this->generateUrl('twitter_stream_stop', array(), UrlGeneratorInterface::ABSOLUTE_URL);
        curl_setopt($curlHandler, CURLOPT_URL, $stopStreamPath);
        curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, 1);
        curl_exec($curlHandler);

        // Create a new background process
        chdir('../');
        $output = array();
        $command = 'nohup php bin/console twitter:listen > /dev/null 2>&1 & echo $!';
        exec($command, $output);
        $processId = (int) $output[0]; // Process ID of the newly created background process. Log this.
        exit(0);
    }

    /**
     * This handler will fetch a log of Process IDs corresponding to any background
     * process and terminate them.
     */
    public function stopStreamAction(Request $request)
    {
        $activeProcesses = ARRAY_COLLECTION_OF_PROCESS_IDS_TO_TERMINATE;

        if (!empty($activeProcesses)) {
            foreach ($activeProcesses as $processId) {
                $command = 'kill ' . $processId . ' 2>&1';
                exec($command, $output);
                $this->get('logger')->info('Twitter Stream Process Terminated: ' . $processId);
            }
        }
        exit(0);
    }

    // ......
}

اذا نظرتم بعناية ، قمنا بتعديل الأمر أننا لن نعدم من المحطة باستخدام exec() وظيفة.

nohup php بن/وحدة التحكم تويتر:الاستماع > /dev/null 2>&1 & echo $!

كل تلك اضافية قطع سيعود معرف العملية للعملية خلفية إنشاء طريق exec() وظيفة. الآن في كل مرة خلفية جديدة العملية التالية هذا النهج ، عقدت سابقا الخلفية سيتم إنهاء العملية (إن وجدت). هذه يجب أن تكون أكثر من كافية لضمان اتصال واحد فقط نشط في كل مرة ، المقدمة لكم بشكل صحيح تسجيل عملية معرفات. يمكنك تحسين هذه الوظيفة وفقا للاحتياجات الخاصة بك.

كل ما تبقى الآن هو أن عملية تيار من البيانات التي سوف نستلم خلال اتصال الأنابيب. لذلك دعونا جعل التحسين إلى خدمة تويتر (TwitterService.php) أولا ثم توجيه أي تويت أن لدينا التطبيق يحصل على معالج (دعونا نسمي هذا processStreamAction) في عملية المقابل هذه التغريدات. في TwitterService.php,

/**
 * Webkul Software.
 *
 * @category	Webkul, Uvdesk
 * @package		Webkul_UVDesk_TF
 * @author		Akshay Kumar
 * @copyright	Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
 * @license 	https://store.webkul.com/license.html
 */

namespace TwitterBundle\Services;

const CONSUMER_KEY = YOUR_APP_CONSUMER_KEY;
const CONSUMER_SECRET = YOUR_APP_CONSUMER_SECRET;
const APPLICATION_TOKEN = YOUR_APP_ACCESS_TOKEN;
const APPLICATION_TOKEN_SECRET = YOUR_APP_ACCESS_TOKEN_SECRET;

require_once __DIR__ . '/../../../vendor/fennb/phirehose/lib/OauthPhirehose.php';

class TwitterListener extends \OauthPhirehose
{
    private $curlHandler = null;
    private $processStreamPath = null;

    public function __construct() {
        parent::__construct(APPLICATION_TOKEN, APPLICATION_TOKEN_SECRET, \Phirehose::METHOD_FILTER);
        $this->processStreamPath = URL_TO_PROCESS_STREAM_ACTION_HANDLER;
        $this->consumerKey = CONSUMER_KEY;
        $this->consumerSecret = CONSUMER_SECRET;
        $this->configureCURL();
    }

    private function configureCURL()
    {
        $this->curlHandler = curl_init();
        $headers = array('Content-type: multipart/form-data');
        curl_setopt($this->curlHandler, CURLOPT_POST, true);
        curl_setopt($this->curlHandler, CURLOPT_URL, $this->processStreamPath);
        curl_setopt($this->curlHandler, CURLOPT_RETURNTRANSFER, 1);
    }

    public function enqueueStatus($status)
    {   
        $twitterFeed = json_decode($status, true);
        if (is_array($twitterFeed) && isset($twitterFeed['user']['screen_name'])) {
            $twitterData = array('feed' => $twitterFeed);
            curl_setopt($this->curlHandler, CURLOPT_POSTFIELDS, http_build_query($twitterData));
            curl_exec($this->curlHandler);
        }
    }
}

class TwitterService
{
	/**
	 * This function will establish a persistent connection with one of the twitter's streaming endpoint.
	 * @param  array  $twitterTrackCollection Collection of tracks which we'll receive updates for
	 */
	public function listenForTweets(array $twitterTrackCollection = [])
    {
    	// Terminate the process if there are no active tracks
    	if (empty($twitterTrackCollection)) {
    		echo 'No active tracks. Terminating Process...' . PHP_EOL . PHP_EOL;
    		exit(0);
    	}

    	$twitterListener = new TwitterListener();
        $twitterListener->setTrack($twitterTrackCollection);
        $twitterListener->consume();
    }
}

الآن في كل مرة على موقع تويتر تلقيها TwitterListener::enqueueStatus() سوف تحيل الغذاء إلى المسار الذي قمنا بتحديده باستخدام الضفيرة بجعل طلب POST. في جوهر, هذا هو بالضبط مثل Webhook إذا كنت تفكر في ذلك. الآن دعونا نكتب processStreamAction() معالج في DefaultController. في DefaultController.php

/**
 * Webkul Software.
 *
 * @category	Webkul, Uvdesk
 * @package		Webkul_UVDesk_TF
 * @author		Akshay Kumar
 * @copyright	Copyright (c) 2010-2016 Webkul Software Private Limited (https://webkul.com)
 * @license 	https://store.webkul.com/license.html
 */

namespace TwitterBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class DefaultController extends Controller
{
    /**
     * This handler will first terminate any previously held background process  
     * by firing the stopStreamAction() handler. Then it'll create a new background  
     * process which establish a new connection with a streaming endpoint.
     */
    public function startStreamAction(Request $request)
    {
    	// Execute the stopStreamAction() handler
        $curlHandler = curl_init();
        $stopStreamPath = $this->generateUrl('twitter_stream_stop', array(), UrlGeneratorInterface::ABSOLUTE_URL);
        curl_setopt($curlHandler, CURLOPT_URL, $stopStreamPath);
        curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, 1);
        curl_exec($curlHandler);

        // Create a new background process
        chdir('../');
        $output = array();
        $command = 'nohup php bin/console twitter:listen > /dev/null 2>&1 & echo $!';
        exec($command, $output);
        $processId = (int) $output[0]; // Process ID of the newly created background process. Log this.
        exit(0);
    }

    /**
     * This handler will fetch a log of Process IDs corresponding to any background
     * process and terminate them.
     */
    public function stopStreamAction(Request $request)
    {
        $activeProcesses = ARRAY_COLLECTION_OF_PROCESS_IDS_TO_TERMINATE;

        if (!empty($activeProcesses)) {
            foreach ($activeProcesses as $processId) {
                $command = 'kill ' . $processId . ' 2>&1';
                exec($command, $output);
                $this->get('logger')->info('Twitter Stream Process Terminated: ' . $processId);
            }
        }
        exit(0);
    }

    /**
     * A POST request will be made to this handler whenever our application receives
     * a feed. You can write your implementation here.
     */
    public function processStreamAction(Request $request)
    {
        if (isset($_POST)) {
            if (array_key_exists('feed', $_POST)) {
            	// Real-time Twitter Feed. Write your own implementation over here.
                $streamContent = $_POST['feed'];
            }
        } else {
            // Request method not supported.
        }
        exit(0);
    }
}

هناك تذهب! الآن لدينا تطبيق كامل الوظائف التي سوف ليس فقط الاستماع لقطات حية من تويتر المحدد المسارات ، ولكن أيضا يسمح لنا تحديث المسارات على الفور تقريبا ، مع التأكد من أن اتصال واحد فقط مع تدفق نقطة النهاية نشطة في لحظة. يمكنك توسيع هذا التطبيق ترضيك وجعلها أكثر قوة و المتسامحة. هنا في UVDesk, نحن اتباع نهج مماثل إلى تزويد مستخدمي تويتر مع أفضل تجربة المستخدم و التواصل الاجتماعي.

Category(s) uvdesk
. . .

Comment

Add Your Comment

Be the first to comment.

css.php