809 Stimmen

Wie führe ich ein einfaches "Long Polling" durch?

Ich kann viele Informationen darüber finden, wie Long Polling funktioniert (zum Beispiel, este y este ), aber keine einfach Beispiele, wie dies in Code umgesetzt werden kann.

Alles, was ich finden kann, ist cometd die auf dem Dojo JS-Framework und einem ziemlich komplexen Serversystem basiert.

Wie würde ich Apache verwenden, um die Anfragen zu bedienen, und wie würde ich ein einfaches Skript (z. B. in PHP) schreiben, das den Server nach neuen Nachrichten "abfragt"?

Das Beispiel muss nicht skalierbar, sicher oder vollständig sein, es muss nur funktionieren!

15voto

Sean O Punkte 1894

Dies ist ein netter 5-minütiger Screencast, der zeigt, wie man lange Abfragen mit PHP und jQuery durchführt: http://screenr.com/SNH

Der Code ist sehr ähnlich zu dbr das obige Beispiel.

12voto

Jasdeep Khalsa Punkte 6270

Hier ist ein einfaches Beispiel für eine lange Abfrage in PHP von Erik Dubbelboer unter Verwendung der Content-type: multipart/x-mixed-replace Kopfzeile:

<?

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
';

Und hier ist eine Demo:

http://dubbelboer.com/multipart.php

11voto

adam Punkte 22004

Ich habe este um mit Comet zurechtzukommen, habe ich Comet auch mit dem Java Glassfish Server eingerichtet und viele andere Beispiele gefunden, indem ich cometdaily.com abonniert habe

9voto

Denis Punkte 3730

Werfen Sie einen Blick auf dieser Blogbeitrag mit Code für eine einfache Chat-App in Python/Django/ gevent .

9voto

Ryan Henderson Punkte 91

Nachfolgend finden Sie eine lange Abfragelösung, die ich für Inform8 Web entwickelt habe. Grundsätzlich überschreiben Sie die Klasse und implementieren die loadData-Methode. Wenn die loadData-Methode einen Wert zurückgibt oder die Operation abbricht, wird das Ergebnis gedruckt und zurückgegeben.

Wenn die Verarbeitung Ihres Skripts länger als 30 Sekunden dauert, müssen Sie den Aufruf von set_time_limit() eventuell auf einen längeren Wert ändern.

Apache 2.0 Lizenz. Neueste Version auf github https://github.com/ryanhend/Inform8/blob/master/Inform8-web/src/config/lib/Inform8/longpoll/LongPoller.php

Ryan

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();

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X