Heim  >  Artikel  >  Backend-Entwicklung  >  PHP implementiert die lange Verbindungsmethode

PHP implementiert die lange Verbindungsmethode

小云云
小云云Original
2018-03-21 11:50:004599Durchsuche

Halten Sie eine Verbindung auf der Serverseite und kehren Sie nicht sofort zurück, bis Daten vorhanden sind. Dies ist das Prinzip der langen Verbindungstechnologie. In diesem Artikel wird die Methode zur Implementierung langer Verbindungen in PHP erläutert um allen zu helfen.

Der Schlüssel zur Technologie für lange Verbindungen besteht darin, eine HTTP-Anfrage zurückzuhalten und nicht auf die Anfrage zu antworten, bis neue Daten vorliegen. Dann initiiert der Client automatisch erneut eine lange Verbindungsanfrage.

So halten Sie sie eine Anfrage? Wolltuch? Der serverseitige Code könnte so aussehen:

set_time_limit(0);  //这句很重要, 不至于运行超时while (true) 
、{    if (hasNewMessage()) 
{        echo json_encode(getNewMessage());        break;
    }
    usleep(100000);      //避免太过频繁的查询}


Ja, er dient dazu, eine Anfrage durch eine Schleife zu halten, damit nicht sofort neue Daten abgefragt werden Erst dann antwortet die Anfrage. Nachdem der Client die Daten verarbeitet hat, initiiert er erneut eine lange Verbindungsanfrage.

Der Client-Code sieht so aus

<script type="text/javascript">
    (function longPolling() {
        $.ajax({            &#39;url&#39;: &#39;server.php&#39;,            &#39;data&#39;: data,            &#39;dataType&#39;: &#39;json&#39;,            &#39;success&#39;: function(data) {
                processData(data);
                longPolling();
            },            &#39;error&#39;: function(data) {
                longPolling();
            }
        });
    })();</script>

Ein einfacher Chatroom

Durch lange Verbindungen können wir einen einfachen Web-Chatroom entwickeln

Als nächstes entwickeln wir einen einfachen Web-Chatroom durch Redis

  1. Wenn jeder Client eine lange Verbindung initiiert, wird auf der Serverseite eine Nachrichtenwarteschlange generiert, die dem Benutzer entspricht. Anschließend wird überwacht, ob neue Daten vorhanden sind, die Daten zur Verarbeitung an den Client zurückgegeben und erneut eine lange Verbindungsanforderung initiiert werden .

  2. Wenn jeder Client eine Nachricht initiiert, sendet er die Nachrichtenwarteschlange.

Das Folgende ist der Codeausschnitt:

<?php namespace church\LongPolling;use Closure;use church\LongPolling\Queue\RedisQueue;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\JsonResponse;class Server{
    public $event = [];    public $redisQueue = null;    public $request = null;    public $response = null;    public function __construct()
    {
        $this->redisQueue = new RedisQueue();        $this->request = Request::createFromGlobals();        $this->response = new JsonResponse();
    }    public function on($event, Closure $closure)
    {
        if (is_callable($closure)) {            $this->event[$event][] = $closure;
        }
    }    public function fire($event)
    {
        if (isset($this->event[$event])) {            foreach ($this->event[$event] as $callback) {
                call_user_func($callback, $this);
            }
        }
    }    public function sendMessage($data)
    {
        switch ($data[&#39;type&#39;]) {            case &#39;unicast&#39;:     //单播
                $this->unicast($data[&#39;target&#39;], $data[&#39;data&#39;], $data[&#39;resource&#39;]);                break;            case &#39;multicast&#39;:       //组播
                foreach ($data[&#39;target&#39;] as $target) {                    $this->unicast($target, $data[&#39;data&#39;], $data[&#39;resource&#39;]);
                }                break;            case &#39;broadcast&#39;:       //广播
                foreach ($this->redisQueue->setQueueName(&#39;connections&#39;) as $target) {                    $this->unicast($target, $data[&#39;data&#39;], $data[&#39;resource&#39;]);
                }                break;
        }        $this->fire(&#39;message&#39;);
    }    public function unicast($target, $message, $resource = &#39;system&#39;)
    {
        $redis_queue = new RedisQueue();        $redis_queue->setQueueName($target)->push($resource . &#39;:&#39; . $message);
    }    public function getMessage($target)
    {
        return $this->redisQueue->setQueueName($target)->pop();
    }    public function hasMessage($target)
    {
        return count($this->redisQueue->setQueueName($target));
    }    public function run()
    {
        $data = $this->request->request;        while (true) {            if ($data->get(&#39;action&#39;) == &#39;getMessage&#39;) {                if ($this->hasMessage($data->get(&#39;target&#39;))) {                    $this->response->setData([                        &#39;state&#39; => &#39;ok&#39;,                        &#39;message&#39; => &#39;获取成功&#39;,                        &#39;data&#39; => $this->getMessage($data->get(&#39;target&#39;))
                    ]);                    $this->response->send();                    break;
                }
            } elseif ($data->get(&#39;action&#39;) == &#39;connect&#39;) {                $exist = false;                foreach ($this->redisQueue->setQueueName(&#39;connections&#39;) as $connection) {                    if ($connection == $data->get(&#39;data&#39;)) {                        $exist = true;
                    }
                }                if (! $exist) {                    $this->redisQueue->setQueueName(&#39;connections&#39;)->push($data->get(&#39;data&#39;));   
                }               
                $this->fire(&#39;connect&#39;);                break;
            }
            usleep(100000);
        }
    }
}

Die Quelle ist Open Source für Github.

Eine einfache Webversion des Chatrooms, die auf der Grundlage langer Verbindungen entwickelt wurde. Durch die Aufrechterhaltung einer langen Verbindung wird jedoch vermieden Der Server verbraucht auch zusätzliche Ressourcen, wenn eine große Parallelität vorliegt. Er kann für den Einsatz in kleinen Anwendungen in Betracht gezogen werden. Es wird eher empfohlen, dass der Client das HTML5-Websocket-Protokoll und der Server Swoole verwendet.

Verwandte Empfehlungen:

So implementieren Sie lange Verbindungen im PHP-Socket

Eine kurze Analyse der Prinzipien von http-Langverbindungen und Kurzverbindungen

Implementierung langer Verbindungen in PHP

Das obige ist der detaillierte Inhalt vonPHP implementiert die lange Verbindungsmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn