Uzun Çağırma, Web Soketleri, Sunucudan Gönderilen Olaylar (SSE) ve Kuyruklu Yıldız nedir?


1047

Bazı makaleleri okumayı denedim, ancak henüz kavramlar hakkında çok net değilim.

Birisi bana bu teknolojilerin ne olduğunu açıklamak için bir çekim yapmak ister mi:

  1. Uzun Oylama
  2. Sunucu Tarafından Gönderilen Etkinlikler
  3. Websockets
  4. kuyrukluyıldız

Her seferinde karşılaştığım bir şey, sunucu bir bağlantıyı açık tutar ve verileri istemciye iletir. Bağlantı nasıl açık tutulur ve istemci aktarılan verileri nasıl alır? (İstemci verileri nasıl kullanır, belki bazı kodlar yardımcı olabilir?)

Şimdi, bunlardan hangisini gerçek zamanlı bir uygulama için kullanmalıyım. Websockets (socket.io [bir node.js kütüphanesi] ile) hakkında çok şey duydum ama neden PHP değil?


1
Gerçek zamanlı websocket veya webrtc? Php websocket için bir kütüphane var, ZMQ veya sadece soket programlama kullanarak çalışması için ekstra kod yazmanız gerekir, nodeJs bu yüzden kolayca kullanılabilir. Websocket php içinde mevcut değildir nedeni, ekstra bir terminal çalıştırmak ve websocket sunucu kolayca kullanılabilir, böylece iki sunucu alt satırında olacak şekilde çalışmaya devam olmasıdır. ve php, javascript gibi bir olay yapısı değildir, dolayısıyla websocket iletileri yakalamak ve göndermek için bir olay yapısı kullanır.
PauAI

Ayrıca: Comet ve ServerSent Olayları, PHP'nin 2 sunucu oluşturmadan neredeyse gerçek zamanlı (gerçekte değil) başarma geçici çözümdür.
PauAI

Yanıtlar:


2076

Aşağıdaki örneklerde istemci tarayıcı ve sunucu web sitesini barındıran web sunucusudur.

Bu teknolojileri anlayabilmeniz için önce klasik HTTP web trafiğini anlamanız gerekir .

Normal HTTP:

  1. İstemci bir sunucudan bir web sayfası ister.
  2. Sunucu yanıtı hesaplar
  3. Sunucu yanıtı istemciye gönderir.

HTTP

Ajax Yoklaması:

  1. İstemci, normal HTTP kullanarak sunucudan bir web sayfası ister (yukarıdaki HTTP'ye bakın).
  2. İstemci istenen web sayfasını alır ve sunucudan düzenli aralıklarla (ör. 0,5 saniye) bir dosya isteyen JavaScript'i sayfa üzerinde yürütür.
  3. Sunucu her yanıtı hesaplar ve normal HTTP trafiği gibi geri gönderir.

Ajax Anketi

Ajax Uzun Oylama:

  1. İstemci, normal HTTP kullanarak sunucudan bir web sayfası ister (yukarıdaki HTTP'ye bakın).
  2. İstemci istenen web sayfasını alır ve sunucudan bir dosya isteyen sayfada JavaScript'i çalıştırır.
  3. Sunucu istenen bilgilere hemen yanıt vermez, ancak yeni bilgiler alana kadar bekler .
  4. Kullanılabilir yeni bilgiler olduğunda, sunucu yeni bilgilerle yanıt verir.
  5. Istemci yeni bilgileri alır ve hemen sunucuya işlemi yeniden başlatarak başka bir istek gönderir.

Ajax Uzun Oylama

HTML5 Sunucusu Gönderilen Etkinlikler (SSE) / EventSource:

  1. İstemci, normal HTTP kullanarak sunucudan bir web sayfası ister (yukarıdaki HTTP'ye bakın).
  2. İstemci istenen web sayfasını alır ve sunucuya bağlantı açan sayfada JavaScript'i çalıştırır.
  3. Yeni bilgiler olduğunda sunucu istemciye bir olay gönderir.

    • Sunucudan istemciye gerçek zamanlı trafik, çoğunlukla ihtiyacınız olan şey
    • Olay döngüsü olan bir sunucu kullanmak isteyeceksiniz
    • Diğer etki alanlarındaki sunucularla bağlantı yalnızca doğru CORS ayarlarıyla mümkündür
    • Daha fazla okumak istiyorsanız, bunları çok yararlı buldum: (makale) , (makale) , (makale) , (öğretici) .

HTML5 SSE

HTML5 Web Soketleri:

  1. İstemci, normal http kullanarak sunucudan bir web sayfası ister (yukarıdaki HTTP'ye bakın).
  2. İstemci istenen web sayfasını alır ve sunucu ile bağlantı açan sayfada JavaScript'i çalıştırır.
  3. Sunucu ve istemci artık yeni veriler (her iki tarafta) kullanılabilir olduğunda birbirlerine mesaj gönderebilirler.

    • Sunucudan istemciye Gerçek zamanlı trafik ve istemciden sunucuya
    • Olay döngüsü olan bir sunucu kullanmak isteyeceksiniz
    • WebSockets ile başka bir etki alanından bir sunucuya bağlanmak mümkündür.
    • Üçüncü taraflarca barındırılan bir websocket sunucusu, örneğin İtici veya diğerleri de kullanılabilir . Bu şekilde sadece müşteri tarafını uygulamak zorunda kalacaksınız, ki bu çok kolay!
    • Daha fazla okumak istiyorsanız, bunları çok yararlı buldum: ( makale ), (makale) ( öğretici ).

HTML5 WebSockets

Comet:

Comet, gerçek zamanlı uygulamalar için akış ve uzun yoklama kullanan HTML5'ten önceki bir teknikler topluluğudur. Vikipedi veya bu makale hakkında daha fazla bilgi edinin .


Şimdi, bunlardan hangisini gerçek zamanlı bir uygulama için kullanmalıyım (kodlamam gerekiyor). Websockets (socket.io [bir node.js kütüphanesi] ile) hakkında çok şey duydum ama neden PHP değil?

WebSockets ile PHP kullanabilirsiniz, Cırcır kontrol edin .


21
Bu harika! SSE'yi okuyorum ve bu makaleyi buldum, çok güzel - şimdi bir şeyler karşılaştırdım gibi, SSE'yi de buraya ekleyebilir misiniz, böylece Websocket ile farkını çapraz kontrol edebilir miyiz?
endeks

1
@Tieme Oh öylemi? SSE'nin Sunucu Gönderilen Olaylar anlamına geldiğini düşündüm. Her neyse, teşekkürler, şimdi görüyorum.
endeks

1
S: php diyelim ki websocket kullanıyorsunuz ws kullanarak sunucuma bağlı her istemci olurdu: kendisine atanan bir iş parçacığı olurdu ve normal isteklerde olduğu gibi boyutu ~ 2mb olurdu? Düğümlerde bu nasıl farklı olurdu? Nodejs kaç eşzamanlı istemciyi işleyebilir ve ara verdiğinde ne olur?
Muhammed Umer

5
Her iki çözümde de aynısını yapabilirsiniz, ancak mekanizma farklıdır. Uzun yoklama 'normal' http verilerini kullanır, SSE farklı bir temel protokol kullanır ve uzun yoklama ile karşılaştırıldığında farklı bir sunucu kurulumuna ihtiyaç duyar.
Tieme

2
İsterseniz apache kullanabilirsiniz. Ancak birçok insan Node.js'yi kullanıyor çünkü bir olay döngüsü var. Ancak Apache için bkz. Stackoverflow.com/questions/12203443/…
Tieme

37

Tieme mükemmel cevabına çok çaba sarf etti, ancak bence OPs sorununun özü, bu teknolojilerin her teknolojinin nasıl çalıştığından ziyade PHP ile nasıl ilişkili olduğu.

PHP, bariz istemci tarafı html, css ve javascript'in yanı sıra web geliştirmede en çok kullanılan dildir. Gerçek zamanlı uygulamalar söz konusu olduğunda PHP'nin 2 önemli sorunu vardır:

1) PHP çok temel bir CGI olarak başladı. PHP, ilk aşamasından beri çok ilerledi, ancak küçük adımlarla oldu. PHP, bugün olduğu gömülü ve esnek C kütüphanesi haline geldiğinde milyonlarca kullanıcıya sahipti, çoğu daha önceki yürütme modeline bağlıydı, bu yüzden henüz kaçmak için sağlam bir girişimde bulunmadı. dahili cgi modeli. Komut satırı arabirimi bile PHP kütüphanesini (linux üzerinde libphp5.so, windows üzerinde php5ts.dll, vb.) Hala bir GET / POST isteğini işleyen bir cgi gibi çağırır. Hala bir "sayfa" oluşturmak ve sonra da yaşam döngüsünü bitirmek zorunda gibi kod yürütür. Sonuç olarak, çok iş parçacıklı veya olay güdümlü programlama (PHP kullanıcı alanı içinde) için çok az desteği vardır, bu da onu gerçek zamanlı, çok kullanıcılı uygulamalar için pratik değildir.

PHP'nin PHP kullanıcı alanında olay döngüleri (libevent gibi) ve iş parçacıkları (pthreads gibi) sağlayacak uzantılara sahip olduğunu, ancak uygulamaların çok azının bunları kullandığını unutmayın.

2) PHP'nin hala çöp toplama konusunda önemli sorunları var. Bu sorunlar sürekli olarak gelişmesine rağmen (muhtemelen yukarıda açıklandığı gibi yaşam döngüsünü sonlandırmak için en büyük adımdır), uzun süren PHP uygulamaları yaratmaya yönelik en iyi denemeler bile düzenli olarak yeniden başlatılmayı gerektirir. Bu aynı zamanda gerçek zamanlı uygulamalar için kullanışsız hale getirir.

PHP 7 de bu sorunları çözmek için harika bir adım olacak ve gerçek zamanlı uygulamalar için bir platform olarak çok umut verici görünüyor.


2
Küçük bir düzeltme: PHP her zaman burada görüldüğü gibi C ile yazılmıştır: museum.php.net/php1 Ayrıca, "daha az kullanılmış (ancak çok daha popüler)" oldukça çelişkilidir; belki ne demek "daha moda"?
IMSoP

@IMSoP - Düzeltme için teşekkürler, PHP'yi on yıldan fazla bir süredir kullanıyorum ve her zaman köklerinin Perl'de olduğu izlenimi altındaydım. PHP geçmiş sayfası, orijinal olarak C olduğunu da açıkça desteklemektedir. Bir an bulduğumda cevabımı düzenleyeceğim.
JSON

Resmi belgelerle iyi karışmadığı için Perl ile ilgili biraz kaldıracağım, ancak bu PHP'nin erken gelişiminde hala kafa karıştırıcı bir alan.
JSON

PHP 7 gerçek zamanlı uygulamalar için bir platform olarak çok umut verici görünüyor? Gerçek zamanlı uygulamalar için PHP7'de ne iyileştirme / değişiklik?
EDECEĞİM-Be-Geri



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.