আমি কীভাবে বেসিক "লং পোলিং" প্রয়োগ করব?


776

লং পোলিং কীভাবে কাজ করে (উদাহরণস্বরূপ, এটি এবং এটি ) এর প্রচুর তথ্য আমি খুঁজে পেতে পারি , তবে কোডটিতে কীভাবে এটি প্রয়োগ করা যায় তার কোনও সাধারণ উদাহরণ নেই।

আমি যা খুঁজে পেতে পারি তা হ'ল কমেড , যা দোজো জেএস ফ্রেমওয়ার্ক এবং একটি মোটামুটি জটিল সার্ভার সিস্টেমের উপর নির্ভর করে ..

মূলত, আমি কীভাবে অনুরোধগুলি পরিবেশন করতে আপাচি ব্যবহার করব এবং আমি কীভাবে একটি সাধারণ স্ক্রিপ্ট লিখব (যেমন পিএইচপি তে) যা নতুন বার্তাগুলির জন্য সার্ভারকে "দীর্ঘ-পোল" করবে?

উদাহরণটি স্কেলযোগ্য, সুরক্ষিত বা সম্পূর্ণ হতে হবে না, এটি কেবল কাজ করা দরকার!

উত্তর:


512

এটি প্রাথমিকভাবে আমি যা ভাবি তার চেয়ে সহজ .. মূলত আপনার একটি পৃষ্ঠা রয়েছে যা কিছু না করে, যতক্ষণ না আপনি প্রেরণ করতে চান ডেটা উপলব্ধ না হয় (বলুন, একটি নতুন বার্তা উপস্থিত হবে)।

এখানে একটি সত্যিকারের প্রাথমিক উদাহরণ, যা 2-10 সেকেন্ড পরে একটি সাধারণ স্ট্রিং প্রেরণ করে। 404 টি ত্রুটি ফিরে আসার 3 টির 1 সুযোগ (আসন্ন জাভাস্ক্রিপ্ট উদাহরণে ত্রুটি পরিচালনা করে দেখানোর জন্য)

msgsrv.php

<?php
if(rand(1,3) == 1){
    /* Fake an error */
    header("HTTP/1.0 404 Not Found");
    die();
}

/* Send a string after a random number of seconds (2-10) */
sleep(rand(2,10));
echo("Hi! Have a random number: " . rand(1,10));
?>

দ্রষ্টব্য: একটি সত্যিকারের সাইটের সাথে, এপাচের মতো একটি নিয়মিত ওয়েব সার্ভারে এটি চালানো দ্রুত সমস্ত "কর্মী থ্রেড" বেঁধে দেবে এবং অন্যান্য অনুরোধগুলিতে সাড়া দিতে অক্ষম রাখবে .. এর চারপাশে উপায় রয়েছে, তবে এটি লেখার জন্য প্রস্তাবিত পাইথনের বাঁকানো মতো কিছুতে একটি "লং-পোল সার্ভার" , যা অনুরোধ অনুসারে একটি থ্রেডের উপর নির্ভর করে না। ধূমকেতু একটি জনপ্রিয় (যা বেশ কয়েকটি ভাষায় উপলভ্য), এবং টর্নেডো একটি নতুন কাঠামো যা বিশেষত এই জাতীয় কাজের জন্য তৈরি করা হয়েছিল (এটি ফ্রেন্ডফিডের দীর্ঘ-পোলিং কোডের জন্য নির্মিত হয়েছিল) ... তবে একটি সাধারণ উদাহরণ হিসাবে অ্যাপাচি যথেষ্ট পরিমাণের চেয়ে বেশি ! এই স্ক্রিপ্টটি সহজেই যে কোনও ভাষায় লেখা যেতে পারে (আমি খুব সহজেই অ্যাপাচি / পিএইচপি বেছে নিয়েছি এবং স্থানীয়ভাবে এগুলি চালিয়ে যাচ্ছিলাম)

তারপরে, জাভাস্ক্রিপ্টে, আপনি উপরের ফাইলটির জন্য অনুরোধ করুন ( msg_srv.php) এবং প্রতিক্রিয়াটির জন্য অপেক্ষা করুন। আপনি যখন একটি পান, আপনি ডেটা উপর কাজ। তারপরে আপনি ফাইলটির জন্য অনুরোধ করুন এবং আবার অপেক্ষা করুন, ডেটা অনুসারে কাজ করুন (এবং পুনরাবৃত্তি করুন)

নিম্নলিখিতটি এরকম একটি পৃষ্ঠার উদাহরণ .. পৃষ্ঠাটি লোড হয়ে গেলে এটি msgsrv.phpফাইলের জন্য প্রাথমিক অনুরোধটি প্রেরণ করে .. যদি এটি সফল হয় তবে #messagesআমরা ম্যাসেজটি ডিভের সাথে সংযোজন করি , তারপরে 1 সেকেন্ডের পরে আমরা আবার ওয়েটফরএমএসজি ফাংশনটি কল করি, যা অপেক্ষার ট্রিগার করে।

1 setTimeout()সেকেন্ডটি আসলেই একটি বেসিক রেট-সীমাবদ্ধ, এটি ব্যতীত সূক্ষ্মভাবে কাজ করে, তবে যদি msgsrv.php সর্বদা তাত্ক্ষণিকভাবে ফিরে আসে (উদাহরণস্বরূপ একটি সিনট্যাক্স ত্রুটি সহ) - আপনি ব্রাউজারটি প্লাবিত করেন এবং এটি দ্রুত হিমশীতল হতে পারে। ফাইলটিতে বৈধ জেএসওএন প্রতিক্রিয়া রয়েছে কিনা এবং / অথবা প্রতি মিনিট / সেকেন্ডে চলমান মোট অনুরোধ রক্ষা করা এবং যথাযথভাবে বিরতি দেওয়া উচিত কিনা তা আরও ভালভাবে পরীক্ষা করা হবে।

পৃষ্ঠাটি ত্রুটি হলে, এটি ত্রুটিটি ডিভের সাথে সংযোজন করে #messages, 15 সেকেন্ড অপেক্ষা করে এবং আবার চেষ্টা করে (প্রতিটি বার্তার পরে আমরা কীভাবে 1 সেকেন্ড অপেক্ষা করি তার অনুরূপ)

এই পদ্ধতির সম্পর্কে দুর্দান্ত জিনিসটি হ'ল এটি অত্যন্ত স্থিতিস্থাপক। যদি ক্লায়েন্টদের ইন্টারনেট সংযোগটি মারা যায়, তবে সময়সীমাটি শেষ হয়ে যাবে, আবার চেষ্টা করুন এবং পুনরায় সংযোগ স্থাপন করুন - এটি কতক্ষণ পোলিংয়ে কাজ করে তা অন্তর্নিহিত, কোনও জটিল ত্রুটি-হ্যান্ডলিংয়ের প্রয়োজন হয় না

যাইহোক, long_poller.htmকোড, jQuery ফ্রেমওয়ার্ক ব্যবহার করে:

<html>
<head>
    <title>BargePoller</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>

    <style type="text/css" media="screen">
      body{ background:#000;color:#fff;font-size:.9em; }
      .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
      .old{ background-color:#246499;}
      .new{ background-color:#3B9957;}
    .error{ background-color:#992E36;}
    </style>

    <script type="text/javascript" charset="utf-8">
    function addmsg(type, msg){
        /* Simple helper to add a div.
        type is the name of a CSS class (old/new/error).
        msg is the contents of the div */
        $("#messages").append(
            "<div class='msg "+ type +"'>"+ msg +"</div>"
        );
    }

    function waitForMsg(){
        /* This requests the url "msgsrv.php"
        When it complete (or errors)*/
        $.ajax({
            type: "GET",
            url: "msgsrv.php",

            async: true, /* If set to non-async, browser shows page as "Loading.."*/
            cache: false,
            timeout:50000, /* Timeout in ms */

            success: function(data){ /* called when request to barge.php completes */
                addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
                setTimeout(
                    waitForMsg, /* Request next message */
                    1000 /* ..after 1 seconds */
                );
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                addmsg("error", textStatus + " (" + errorThrown + ")");
                setTimeout(
                    waitForMsg, /* Try again after.. */
                    15000); /* milliseconds (15seconds) */
            }
        });
    };

    $(document).ready(function(){
        waitForMsg(); /* Start the inital request */
    });
    </script>
</head>
<body>
    <div id="messages">
        <div class="msg old">
            BargePoll message requester!
        </div>
    </div>
</body>
</html>

7
এই ধারণাটি ব্যবহার করে কিছু বার্তা পিছলে যেতে পারেনি? এই প্রথম দ্বিতীয় বারের মধ্যে, 1000 চ্যাট বার্তা প্রেরণ করা হয়েছে বলে, কীভাবে সার্ভারটি সেই ক্লায়েন্টকে বিশেষত 1000 বার্তা প্রেরণ করতে জানবে?
দেবদেবদেভ

15
সম্ভবত। ধারণাটি প্রদর্শনের জন্য এটি একটি খুব সরল উদাহরণ, এটি আরও ভাল করার জন্য আপনার আরও বিস্তৃত সার্ভার-সাইড কোডের প্রয়োজন হবে যেখানে এটি সেই নির্দিষ্ট ক্লায়েন্টের জন্য সেই 1000 বার্তাগুলি সংরক্ষণ করবে এবং সেগুলিকে একটি অংশে প্রেরণ করবে। আপনি ওয়েটফোর্সএমএসজি সময়সীমাটি নিরাপদে হ্রাস করতে পারবেন
br

21
দীর্ঘ জরিপ অনুরোধের জন্য নোডেজ হ'ল আর একটি দুর্দান্ত সার্ভার সাইড সমাধান, অতিরিক্ত সুবিধা ( ট্যুইস্টেড ওভার) সহ যা আপনি জাভাস্ক্রিপ্টে সার্ভার কোডও লিখতে পারেন।
হুস্কি

8
এটি কেবলমাত্র 1 সেকেন্ড অন্তর সহ সার্ভারের সাথে একটি সরল পুনরাবৃত্তি AJAX সংযোগ। "দীর্ঘ ভোটদান" এর সাথে এর কোনও যোগসূত্র নেই। দীর্ঘ ভোটদানের সাথে ক্লায়েন্টের মেয়াদ উত্তীর্ণ হওয়ার পরিমাণ দীর্ঘ হওয়া উচিত।
Deele

6
প্রশ্নটি হল একটি প্রকৃত পিএইচপি স্ক্রিপ্ট পরিবর্তে কী করে sleep(rand(2,10));? কিছু না করার জন্য, প্রতি 100 মিলিসেক ডাটাবেসটি পোল করুন? এটা কখন মরতে হবে?
লুইস সিকোট

41

স্ল্যাশের অংশ হিসাবে আমি একটি খুব সাধারণ চ্যাট উদাহরণ পেয়েছি ।

সম্পাদনা করুন (যেহেতু প্রত্যেকে এখানে কোডটি আটকানো হয়েছে)

লং-পোলিং এবং স্ল্যাশ ব্যবহার করে এটি সম্পূর্ণ JSON- ভিত্তিক বহু-ব্যবহারকারী চ্যাট । এটি কীভাবে কল করবেন তার একটি ডেমো , সুতরাং দয়া করে এক্সএসএস সমস্যাগুলি উপেক্ষা করুন। এটি প্রথমে স্যানিটেশন না করে কেউ এটিকে স্থাপন করা উচিত নয়।

খেয়াল করুন যে ক্লায়েন্টটির সর্বদা সার্ভারের সাথে সংযোগ রয়েছে এবং যে কোনও বার্তা প্রেরণ করার সাথে সাথেই প্রত্যেকের এটি মোটামুটি তাত্ক্ষণিকভাবে দেখা উচিত।

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Copyright (c) 2008 Dustin Sallings <dustin+html@spy.net> -->
<html lang="en">
  <head>
    <title>slosh chat</title>
    <script type="text/javascript"
      src="http://code.jquery.com/jquery-latest.js"></script>
    <link title="Default" rel="stylesheet" media="screen" href="style.css" />
  </head>

  <body>
    <h1>Welcome to Slosh Chat</h1>

    <div id="messages">
      <div>
        <span class="from">First!:</span>
        <span class="msg">Welcome to chat. Please don't hurt each other.</span>
      </div>
    </div>

    <form method="post" action="#">
      <div>Nick: <input id='from' type="text" name="from"/></div>
      <div>Message:</div>
      <div><textarea id='msg' name="msg"></textarea></div>
      <div><input type="submit" value="Say it" id="submit"/></div>
    </form>

    <script type="text/javascript">
      function gotData(json, st) {
        var msgs=$('#messages');
        $.each(json.res, function(idx, p) {
          var from = p.from[0]
          var msg = p.msg[0]
          msgs.append("<div><span class='from'>" + from + ":</span>" +
            " <span class='msg'>" + msg + "</span></div>");
        });
        // The jQuery wrapped msgs above does not work here.
        var msgs=document.getElementById("messages");
        msgs.scrollTop = msgs.scrollHeight;
      }

      function getNewComments() {
        $.getJSON('/topics/chat.json', gotData);
      }

      $(document).ready(function() {
        $(document).ajaxStop(getNewComments);
        $("form").submit(function() {
          $.post('/topics/chat', $('form').serialize());
          return false;
        });
        getNewComments();
      });
    </script>
  </body>
</html>

1
আমি কীভাবে জানতে পারি এটি কীভাবে সর্বদা সংযুক্ত থাকে? দুঃখিত যদি আমি নির্বোধ কিছু জিজ্ঞাসা করি তবে আমি এটি জানতে চাই।
রকি সিং

4
এটি একটি এইচটিটিপি জিইটি করে এবং ডেটা উপলব্ধ না হওয়া পর্যন্ত সার্ভার জিইটি অবরোধ করে। সার্ভারে ডেটা উপস্থিত হয়ে সার্ভারটি ক্লায়েন্টকে ডেটা ফিরিয়ে দেয়, অন্য যে কোনও কিছু আসতে পারে তা সারি করে দেয় এবং তারপরে ক্লায়েন্ট পুনরায় সংযোগ করে এবং যদি থাকে তবে নিখোঁজ বার্তাগুলি তুলে রাখে, অন্যথায় এটি আবার ব্লক হয়ে যায়।
ডাস্টিন

4
প্রথমে সুস্পষ্ট নাও হতে পারে তবে জিনিসটি হ'ল 'সর্বদা সংযুক্ত রাষ্ট্রের' জন্য দায়ীgetNewComments সেখানে কলব্যাক সহ আজাক্সটপ , সুতরাং এটি কেবলমাত্র প্রতিটি
এজাক্স

32

টর্নেডো দীর্ঘ-ভোটদানের জন্য ডিজাইন করা হয়েছে এবং এতে সার্ভার কোড এবং জেএস ক্লায়েন্ট কোড সহ / উদাহরণ / চ্যাটডেমোতে খুব ন্যূনতম (পাইথনের কয়েকশ লাইনের) চ্যাট অ্যাপ অন্তর্ভুক্ত রয়েছে। এটি এর মতো কাজ করে:

  • ক্লায়েন্টরা (শেষ বার্তার সংখ্যা) যেহেতু আপডেটের জন্য জিজ্ঞাসা করতে জেএস ব্যবহার করে, সার্ভার ইউআরএল হ্যান্ডলার এগুলি গ্রহণ করে এবং ক্লায়েন্টকে একটি সারিতে প্রতিক্রিয়া জানাতে একটি কলব্যাক যোগ করে।

  • সার্ভারটি যখন একটি নতুন বার্তা পায়, অনেমসেজ ইভেন্টটি ফায়ার করে, কলব্যাকগুলির মধ্য দিয়ে লুপ করে এবং বার্তা প্রেরণ করে।

  • ক্লায়েন্ট-সাইড জেএস বার্তাটি গ্রহণ করে, পৃষ্ঠাটিতে যুক্ত করে, তারপরে এই নতুন বার্তা আইডি থেকে আপডেট জানতে চায়।


25

আমি মনে করি ক্লায়েন্টটি একটি সাধারণ অ্যাসিনক্রোনাস এজেএক্স অনুরোধের মতো দেখাচ্ছে তবে আপনি প্রত্যাশা করছেন এটি ফিরে আসতে "দীর্ঘ সময়" লাগবে।

সার্ভারটি তখন এর মতো দেখায়।

while (!hasNewData())
    usleep(50);

outputNewData();

সুতরাং, এজেএক্স অনুরোধটি সার্ভারে যায়, সম্ভবত এটি শেষ আপডেটের সময়কালীন স্ট্যাম্প সহ যাতে hasNewData()আপনি ইতিমধ্যে কোন ডেটা পেয়েছেন তা আপনার জানে। সার্ভারটি তখন নতুন ডেটা উপলব্ধ না হওয়া পর্যন্ত একটি লুপে ঘুমায় sleeping সমস্ত সময়, আপনার AJAX অনুরোধটি এখনও সংযুক্ত রয়েছে, কেবলমাত্র সেখানে অপেক্ষা করা হচ্ছে তথ্যের জন্য অপেক্ষা করে। শেষ অবধি, যখন নতুন ডেটা পাওয়া যায়, সার্ভার এটি আপনার AJAX অনুরোধে দেয় এবং সংযোগটি বন্ধ করে দেয়।


10
এটি একটি ব্যস্ত অপেক্ষা যা আপনার বর্তমান থ্রেডকে ব্লক করে। এটি মোটেও স্কেল করে না।
ওয়াউটার লাইভেন্সস

10
না, আমাদের ঘুম ব্যস্ত অপেক্ষা নয়। এবং "অপেক্ষার" পুরো বিন্দুটি আপনার থ্রেডটি কিছুক্ষণের জন্য অবরুদ্ধ করে। সম্ভবত তিনি 50 মিলিসেকেন্ড (ইউএসএল (50000)) অর্থ 50 মাইক্রোসেকেন্ড নয়! তবে যাইহোক, একটি সাধারণ অ্যাপাচি / পিএইচপি সেটআপ সহ, এটি করার কোনও অন্য উপায় আছে?
ম্যাট

ঠিক আছে, প্রিস্পেল থেকে, আপনি অপেক্ষা না করে চ্যাট বার্তার জন্য একটি ব্লকিং ফাংশন করতে পারবেন না।
টোমা জ্যাটো - মনিকা

সত্যিই দুর্দান্ত! আমি নতুন ডেটা পরীক্ষা করার জন্য সার্ভারে একটি পুনরাবৃত্ত ফাংশন তৈরি করেছি। তবে দীর্ঘ ভোটদানের দক্ষতার সাথে ব্যবহার করার জন্য সেরা পণ্যটি কী? আমি সাধারণ অ্যাপাচি ব্যবহার করি এবং আমি 4/5 ব্রাউজারের বেশি ট্যাব খুললে সার্ভার প্রতিক্রিয়া জানায় না :( পিএইচপি
আধুনিকরা

17

এখানে কিছু শ্রেণীর আমি C # দীর্ঘ পোলিং জন্য ব্যবহার হয়। মূলত 6 টি ক্লাস রয়েছে (নীচে দেখুন)

  1. নিয়ামক : একটি বৈধ প্রতিক্রিয়া (ডিবি অপারেশন ইত্যাদি) তৈরি করতে প্রয়োজনীয় ক্রিয়াকলাপগুলি
  2. প্রসেসর : ওয়েব পৃষ্ঠার সাথে অ্যাসিঞ্চ যোগাযোগ পরিচালনা করে (নিজেই)
  3. আইএএসিনচপ্রসেসর : পরিষেবাটি এই ইন্টারফেসটি প্রয়োগ করে এমন উদাহরণগুলি প্রসেস করে
  4. সেভিস : প্রক্রিয়াগুলি আইএএসসিঞ্চপ্রসেসর প্রয়োগকারী অবজেক্টগুলিকে অনুরোধ করে
  5. অনুরোধ : আপনার প্রতিক্রিয়া (অবজেক্ট) সম্বলিত আইএসিঞ্চ প্রসেসরের মোড়ক
  6. প্রতিক্রিয়া : কাস্টম অবজেক্ট বা ক্ষেত্র সমন্বিত

2
ঠিক আছে ... তাহলে কেন এটিকে ভোট দেওয়া হয়েছিল? এই ক্লাসগুলি প্রকৃতপক্ষে দীর্ঘ ভোটদানের বৈধ উদাহরণ examples
বন্দী

বাস্তব দীর্ঘ-পোলিং (সাধারণভাবে) আপনি একটি সাধারণ-পোল পরিচালনা করেন (কোনও সংস্থার উপর) অন্তর অন্তর বাড়ানোর অনুশীলন নয়। এটি একটি বৃহত্তর প্যাটার্নের অংশ ... যা "কিছুটা" ব্যাখ্যার বিষয় ... তবে সামগ্রিক বাস্তবায়নের নির্দিষ্ট কিছু ক্ষেত্রে। বলেছিল ... এই ক্লাসগুলি অনুসরণিত প্যাটার্ন অনুসরণ করে! সুতরাং আপনার যদি এটিকে ভোটা দেওয়ার কোনও কারণ থাকে ... তবে আমি সত্যিই কারণটিতে আগ্রহী হব।
বন্দী জেরো

এটি কোনও সাধারণ কোড উদাহরণের প্রশ্নকে সরাসরি সম্বোধন না করায় এটি ভোট দেওয়া হয়েছে। অবশ্যই আমি এটি ভোট দিয়েছি নি তাই কেবল অনুমান করতে পারি।
অ্যান্ড্রু

16

পিএইচপি এবং জিকুয়েরি ব্যবহার করে কীভাবে দীর্ঘ ভোটদান করা যায় সে সম্পর্কে এটি একটি দুর্দান্ত 5 মিনিটের স্ক্রিনকাস্ট: http://screenr.com/SNH

কোড উপরের ডিবিআরের উদাহরণের সাথে বেশ মিল ।


3
আমি মনে করি আপনার এটি কেবল দীর্ঘ-ভোটদানের পরিচিতি হিসাবে দেখা উচিত কারণ এই প্রয়োগটি অবশ্যই অনেকগুলি সহবর্তী ব্যবহারকারীদের সাথে আপনার সার্ভারকে হত্যা করবে।
আলফ্রেড

আমি কেবল এই সমস্ত সম্পর্কে শিখছি ... কতটা নির্ভরযোগ্য, বা না, এটি কয়েকটি ব্যবহারকারীর সাথে ... 10 বলে আবার চ্যাট করুন?
সোমবার

12

এখানে শিরোনামটি ব্যবহার করে এরিক ডাবলবোয়ার পিএইচপি-তে একটি দীর্ঘ দীর্ঘ-পোলিংয়ের উদাহরণ দিয়েছেনContent-type: multipart/x-mixed-replace :

<?

header('Content-type: multipart/x-mixed-replace; boundary=endofsection');

// Keep in mind that the empty line is important to separate the headers
// from the content.
echo 'Content-type: text/plain

After 5 seconds this will go away and a cat will appear...
--endofsection
';
flush(); // Don't forget to flush the content to the browser.


sleep(5);


echo 'Content-type: image/jpg

';

$stream = fopen('cat.jpg', 'rb');
fpassthru($stream);
fclose($stream);

echo '
--endofsection
';

এবং এখানে একটি ডেমো রয়েছে:

http://dubbelboer.com/multipart.php


11

আমি এটিকে ধূমকেতুর সাথে আঁকড়ে ধরতে ব্যবহার করেছি, আমি জাভা গ্লাসফিশ সার্ভারটি ব্যবহার করে ধূমকেতু সেট আপ করেছি এবং কমেটডাইলি ডটকমকে সাবস্ক্রাইব করে প্রচুর অন্যান্য উদাহরণ পেয়েছি



9

নীচে আমি ইনফর্ম 8 ওয়েবের জন্য একটি দীর্ঘ পোলিং সমাধান তৈরি করেছি। মূলত আপনি ক্লাসটিকে ওভাররাইড করে লোডডাটা পদ্ধতিটি প্রয়োগ করেন। যখন লোডডাটা কোনও মান দেয় বা অপারেশন সময় শেষ হয় এটি ফলাফল মুদ্রণ করে ফিরে আসবে।

যদি আপনার স্ক্রিপ্টটির প্রসেসিংয়ে 30 সেকেন্ডের বেশি সময় লাগতে পারে তবে আপনাকে আর বেশি কিছুতে সেট_টাইম_লিমিট () কলটি পরিবর্তন করতে হতে পারে।

অ্যাপাচি 2.0 লাইসেন্স। GitHub সর্বশেষ সংস্করণে https://github.com/ryanhend/Inform8/blob/master/Inform8-web/src/config/lib/Inform8/longpoll/LongPoller.php

রায়ান

abstract class LongPoller {

  protected $sleepTime = 5;
  protected $timeoutTime = 30;

  function __construct() {
  }


  function setTimeout($timeout) {
    $this->timeoutTime = $timeout;
  }

  function setSleep($sleep) {
    $this->sleepTime = $sleepTime;
  }


  public function run() {
    $data = NULL;
    $timeout = 0;

    set_time_limit($this->timeoutTime + $this->sleepTime + 15);

    //Query database for data
    while($data == NULL && $timeout < $this->timeoutTime) {
      $data = $this->loadData();
      if($data == NULL){

        //No new orders, flush to notify php still alive
        flush();

        //Wait for new Messages
        sleep($this->sleepTime);
        $timeout += $this->sleepTime;
      }else{
        echo $data;
        flush();
      }
    }

  }


  protected abstract function loadData();

}

8

কোড, জন্য ধন্যবাদ dbrলাইনটির চারপাশে দীর্ঘ_প্লেলেআরএইচটিএম এ কেবলমাত্র একটি ছোট টাইপ

1000 /* ..after 1 seconds */

আমি মনে করি এটি

"1000"); /* ..after 1 seconds */

এটি কাজ করার জন্য।

আগ্রহীদের জন্য, আমি একটি জ্যাঙ্গো সমতুল্য চেষ্টা করেছিলাম। একটি নতুন জ্যাঙ্গো প্রকল্প শুরু করুন, দীর্ঘ ভোটদানের জন্য এলপি বলুন :

django-admin.py startproject lp

বার্তা সার্ভারের জন্য অ্যাপ্লিকেশনটিকে msgsrv কল করুন :

python manage.py startapp msgsrv

টেমপ্লেট ডিরেক্টরি থাকতে সেটিংস. py এ নিম্নলিখিত লাইনগুলি যুক্ত করুন :

import os.path
PROJECT_DIR = os.path.dirname(__file__)
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates'),
)

Url.py এ আপনার URL নিদর্শনগুলি সংজ্ঞায়িত করুন :

from django.views.generic.simple import direct_to_template
from lp.msgsrv.views import retmsg

urlpatterns = patterns('',
    (r'^msgsrv\.php$', retmsg),
    (r'^long_poller\.htm$', direct_to_template, {'template': 'long_poller.htm'}),
)

এবং এমএসএসআরভি / ভিউস.পি দেখতে হবে:

from random import randint
from time import sleep
from django.http import HttpResponse, HttpResponseNotFound

def retmsg(request):
    if randint(1,3) == 1:
        return HttpResponseNotFound('<h1>Page not found</h1>')
    else:
        sleep(randint(2,10))
        return HttpResponse('Hi! Have a random number: %s' % str(randint(1,10)))

শেষ অবধি , টেমপ্লেটগুলি / দীর্ঘ_পল্লে.আরটিএমটি ঠিক একই সাথে টাইপও সংশোধন করা উচিত। আশাকরি এটা সাহায্য করবে.


আসলে, "15000"সিনট্যাক্স ত্রুটি। সেটটাইমআউট এটির দ্বিতীয় প্যারামিটার হিসাবে একটি পূর্ণসংখ্যা নেয়।
অ্যান্ড্রু হেজেস

এই উত্তরের কাজ দরকার। এটি এক বা একাধিক মন্তব্য এবং একটি পৃথক উত্তর বা উত্তরগুলির চূড়ান্ত।
ব্রায়ান ওয়েবস্টার

8

এটি এমন একটি পরিস্থিতিতে যা পিএইচপি খুব খারাপ পছন্দ। পূর্বে উল্লিখিত হিসাবে, আপনি খুব দ্রুত এই জাতীয় কিছু করে আপনার সমস্ত অ্যাপাচি কর্মীদের বেঁধে রাখতে পারেন। পিএইচপি শুরু, সম্পাদন, থামার জন্য নির্মিত। এটি শুরু করার জন্য নির্মিত হয়নি, অপেক্ষা করুন ... চালানো, থামিয়ে দিন। আপনি খুব শীঘ্রই আপনার সার্ভারটি ছুঁড়ে ফেলবেন এবং দেখতে পাবেন যে আপনার অবিশ্বাস্য স্কেলিংয়ের সমস্যা রয়েছে।

এটি বলেছিল, আপনি এখনও পিএইচপি দিয়ে এটি করতে পারেন এবং এটি আপনার সার্ভারটি এনজিএনএস এইচটিপপুষ্পস্ট্রিমমডিউল ব্যবহার করে হত্যা করতে না পারে: http://wiki.nginx.org/HttpPushStreamModule

আপনি অ্যাপাচি (বা অন্য যাই হোক না কেন) এর সামনে এনগিনেক্স সেটআপ করেন এবং এটি সমবর্তী সংযোগগুলি খোলা রাখার যত্ন নেবে। আপনি কেবল কোনও অভ্যন্তরীণ ঠিকানায় ডেটা প্রেরণে পে-লোডের সাথে প্রতিক্রিয়া জানান যা আপনি কোনও পটভূমির কাজ দিয়ে করতে পারেন বা যখনই নতুন অনুরোধ আসে তখনই অপেক্ষা করা লোকগুলিতে বার্তাটি সরিয়ে দেওয়া হয় This এটি দীর্ঘ ভোটদানের সময় পিএইচপি প্রক্রিয়াগুলিকে খালি বসে থেকে বজায় রাখে।

এটি পিএইচপি-তে একচেটিয়া নয় এবং কোনও ব্যাক-এন্ড ভাষার সাথে এনজিনেক্স ব্যবহার করেও করা যেতে পারে। একযোগে উন্মুক্ত সংযোগগুলি লোড নোড.জেসের সমান তাই সবচেয়ে বড় পার্কটি হ'ল এটি আপনাকে এরকম কোনও কিছুর জন্য নিডিং নোড থেকে বের করে দেয়।

দীর্ঘ ভোটদান সম্পন্ন করার জন্য আপনি অনেক অন্যান্য লোককে অন্যান্য ভাষার লাইব্রেরি উল্লেখ করছেন এবং এটি সঙ্গত কারণেই। পিএইচপি স্বাভাবিকভাবেই এই ধরণের আচরণের জন্য ভালভাবে নির্মিত হয় না।


এটি কি অ্যাপাচি সমস্যা বা পিএইচপি সমস্যা? আমার পিএইচপি কোডটি সরাসরি এনগিনেক্স বা লাইটটিপিতে চালিত হলে আমার কি দীর্ঘ পোলিংয়ের সমস্যা হবে?
ডেভিড

এটি পিএইচপি সমস্যা কম এবং পিএইচপি অপব্যবহার কম। প্রতিটি অনুরোধে পিএইচপি স্ক্র্যাচ থেকে স্ক্রিপ্টটি চালায়, প্রয়োজন অনুসারে গ্রন্থাগারগুলি লোড করা হচ্ছে, এর কোডটি কার্যকর করা এবং তারপরে বন্ধ হয়ে যাওয়ার সময় সমস্ত অনুরোধের মধ্যে আবর্জনা সংগ্রহ করা শুরু হয়েছিল। দেরী স্ট্যাটিক বাইন্ডিংস, অলস লোডিং, ডিস্ক আই / ও অপসারণের জন্য মেমরি বাইটকোড ক্যাশে যেমন প্রভাব কমাতে পিএইচপিগুলিতে বেশ কয়েকটি পরিবর্তন সাধিত হয়েছে। সমস্যা এখনও রয়ে গেছে যে পিএইচপি দ্রুত আরম্ভ এবং দ্রুত থামানোর উদ্দেশ্যে তৈরি হয়েছিল যতটুকু সম্ভব. যে ভাষাগুলি একবার / বুট হয়ে লোড হবে এবং অনুরোধটির জন্য একটি থ্রেড খুলবে লম্বা ভোট দেওয়ার জন্য এটি আরও ভাল suited
উজ্জ্বলবল

তবে প্রশ্নের উত্তর দেওয়ার জন্য, হ্যাঁ আপনি অ্যাপাচি ব্যবহার করছেন বা অন্য কিছু ব্যবহার না করেই আপনি সমস্যাটি অনুভব করবেন। এটি ঠিক কীভাবে পিএইচপি কাজ করে। আমার এটি সংশোধন করে বলা উচিত যে, আপনি যদি সর্বাধিক পরিচিত ট্র্যাফিক লোড করতে যাচ্ছেন পিএইচপি ঠিক আছে will আমি এমবেডেড সিস্টেমগুলি পিএইচপি ব্যবহার করে দেখেছি যেগুলির কোনও সমস্যা নেই কারণ কেবল কয়েকটি সংযোগ রয়েছে। সম্ভাব্য কোনও সংস্থার ইন্ট্রানেটে এটি পাসওযোগ্য হতে পারে। জনসাধারণের মুখোমুখি অ্যাপ্লিকেশনগুলির জন্য, ট্র্যাফিক বাড়ার সাথে সাথে আপনি আপনার সার্ভারগুলি একেবারে মেরে ফেলবেন।
উজ্জ্বলবল

4

দীর্ঘ ভোটদানের পরিবর্তে ওয়েব সকেটগুলি কেন বিবেচনা করবেন না? এগুলি অনেক দক্ষ এবং সেটআপ করা সহজ। তবে এগুলি কেবল আধুনিক ব্রাউজারগুলিতে সমর্থিত। এখানে একটি দ্রুত রেফারেন্স দেওয়া হয়


আমি মনে করি একবার ওয়েবসকেটগুলি সর্বত্র প্রয়োগ করা হয়েছে (সম্ভবত বছরের পর বছর নয়) তারা এই ধরণের প্রয়োগের মান হবে। দুর্ভাগ্যজনকভাবে আপাতত, আমরা প্রযোজনা অ্যাপগুলির জন্য তাদের উপর নির্ভর করতে পারি না।
রিচার্ড

3
@Richard আপনি কিন্তু Socket.IO যা স্বয়ংক্রিয় ফলব্যাক পরিবহন প্রদান করে ভালো কিছু ব্যবহার করতে পারেন, মানে 6. ওয়েব-সকেট মত নিচে কার্যকারিতা সব পথ প্রদানের
ব্র্যাড

3

ডাব্লুএস-আই গ্রুপটি "নির্ভরযোগ্য সিকিউর প্রোফাইল" নামে একটি প্রকাশ করেছে যার মধ্যে একটি গ্লাস ফিশ এবং। নেট বাস্তবায়ন রয়েছে যা স্পষ্টতই আন্তঃ অপারেটিং করে।

কোনও ভাগ্যের সাথে সাথে সেখানে একটি জাভাস্ক্রিপ্ট বাস্তবায়ন রয়েছে।

সিলভারলাইট বাস্তবায়নও রয়েছে যা এইচটিটিপি দ্বৈত ব্যবহার করে যখন কোনও ধাক্কা আসে তখন আপনি কলব্যাকগুলি পেতে সিলভারলাইট অবজেক্টে জাভাস্ক্রিপ্ট সংযোগ করতে পারেন ।

এছাড়াও রয়েছে বাণিজ্যিক অর্থ প্রদান সংস্করণ পাশাপাশি।


2

একটি এএসপি.এনইটি এমভিসি বাস্তবায়নের জন্য, সিগন্যালআরটি দেখুন যা নুগেটে উপলভ্য .. নোট করুন যে নুগেটটি প্রায়শই গিট উত্স থেকে পুরানো হয়ে থাকে যা খুব ঘন ঘন কমিট করে।

স্কট হ্যানসেলম্যানের একটি ব্লগে সিগন্যালআর সম্পর্কে আরও পড়ুন


2

আপনি আইকোমেট ( https://github.com/ideawu/icomet ) চেষ্টা করতে পারেন , মুক্তির সাথে নির্মিত একটি C1000K সি ++ ধূমকেতু সার্ভার। আইকোমেট একটি জাভাস্ক্রিপ্ট লাইব্রেরি সরবরাহ করে, এটি যতটা সহজ ব্যবহার করা সহজ

var comet = new iComet({
    sign_url: 'http://' + app_host + '/sign?obj=' + obj,
    sub_url: 'http://' + icomet_host + '/sub',
    callback: function(msg){
        // on server push
        alert(msg.content);
    }
});

আইকোমেট সাফারি (আইওএস, ম্যাক), আইইএস (উইন্ডোজ), ফায়ারফক্স, ক্রোম ইত্যাদি সহ বিভিন্ন ব্রাউজার এবং ওএসএস সমর্থন করে supports


0

সিম্পলড নোডজেএস

const http = require('http');

const server = http.createServer((req, res) => {
  SomeVeryLongAction(res);
});

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

server.listen(8000);

// the long running task - simplified to setTimeout here
// but can be async, wait from websocket service - whatever really
function SomeVeryLongAction(response) {
  setTimeout(response.end, 10000);
}

এক্সপ্রেসে উত্পাদনের ভিত্তিতে দৃশ্যমান অসাধারণর জন্য আপনি মিডওয়্যারের সাথে পাবেন response। আপনার যা করা দরকার তা কি, ম্যাপ বা কোনও কিছুতে (যা অন্যান্য প্রবাহের জন্য দৃশ্যমান) লম্বা পোল্ড পদ্ধতিতে সমস্ত সুযোগ তৈরি করতে পারে এবং <Response> response.end()আপনি যখন প্রস্তুত হন তখনই অনুরোধ করতে পারেন। দীর্ঘ পোল সংযোগগুলি সম্পর্কে বিশেষ কিছু নেই। বিশ্রামটি ঠিক কীভাবে আপনি সাধারণত আপনার অ্যাপ্লিকেশনটি কাঠামো করেন।

আপনি যদি স্কোপিংয়ের মাধ্যমে আমি কী বোঝাতে চাই না তবে এটি আপনাকে ধারণা দেওয়া উচিত

const http = require('http');
var responsesArray = [];

const server = http.createServer((req, res) => {
  // not dealing with connection
  // put it on stack (array in this case)
  responsesArray.push(res);
  // end this is where normal api flow ends
});

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

// and eventually when we are ready to resolve
// that if is there just to ensure you actually 
// called endpoint before the timeout kicks in
function SomeVeryLongAction() {
  if ( responsesArray.length ) {
    let localResponse = responsesArray.shift();
    localResponse.end();
  }
}

// simulate some action out of endpoint flow
setTimeout(SomeVeryLongAction, 10000);
server.listen(8000);

আপনি দেখতে পাচ্ছেন, আপনি সমস্ত সংযোগকে সত্যই প্রতিক্রিয়া জানাতে পারেন, এক, আপনি যা চান তা করতে পারেন। নেই idতাই আপনি API কল আউট মানচিত্র এবং অ্যাক্সেস নির্দিষ্ট ব্যবহার করতে সক্ষম হওয়া উচিত যে অনুরোধের জন্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.