PHP ile kuyrukluyıldızı kullanma?

11 Cevap php

Ben bir PHP arka uç kullanarak gerçek zamanlı sohbet uygulanması düşünüyordum, ama ben kuyruklu tartışan bir sitede bu yorumun karşılaştım:

My understanding is that PHP is a terrible language for Comet, because Comet requires you to keep a persistent connection open to each browser client. Using mod_php this means tying up an Apache child full-time for each client which doesn’t scale at all. The people I know doing Comet stuff are mostly using Twisted Python which is designed to handle hundreds or thousands of simultaneous connections.

Bu doğru mudur? Yoksa etrafında konfigüre edilebilir bir şeydir?

11 Cevap

Zaten ne dedi genişleyen / kabul, ben FastCGI sorunu çözmek sanmıyorum.

Apache

Istek tamamlanıncaya kadar Apache içine Her istek COMET istekleri için uzun bir süre olabilir ki, bir iş parçacığı kullanır.

This article on Ajaxian Apache üzerinde COMET kullanarak bahseder ve bunun zor olduğunu. Sorun PHP özgü değildir ve Apache kullanmak isteyebilirsiniz herhangi bir arka-uç CGI modülü için geçerlidir.

Önerilen çözüm istekleri işçi iş parçacığı gönderilir biçimini değiştirir 'event' MPM module, hangi kullanımı idi.

This MPM tries to fix the 'keep alive problem' in HTTP. After a client completes the first request, the client can keep the connection open, and send further requests using the same socket. This can save signifigant overhead in creating TCP connections. However, Apache traditionally keeps an entire child process/thread waiting for data from the client, which brings its own disadvantages. To solve this problem, this MPM uses a dedicated thread to handle both the Listening sockets, and all sockets that are in a Keep Alive state.

Sadece 'erteleme' after bir istek müşteri yeni bir isteği bekliyor, tamamlandığında çünkü Ne yazık ki, ya da çalışmıyor.

PHP

Eğer kuyrukluyıldız istek başına bir iş parçacığı havaya ile sorunu çözmek bile Şimdi, sorunun diğer tarafı göz önüne alınarak, yine istek başına bir PHP konu gerekecektir - FastCGI yardımcı olmaz bu yüzden.

Sen Continuations onlar tarafından tetiklenen olay görülmektedir zaman kuyruklu istekleri devam edilmesine izin gibi bir şey gerekir. AFAIK, bu PHP mümkün olan bir şey değildir. Ben sadece Java gördüm - Apache Tomcat server bkz.

Edit:

Bir article here (HAProxy) Eğer port 80 üzerinde bir apache sunucusu ve bir kuyrukluyıldız özellikli sunucu (örneğin, dalgakıran, Java için tomcat'ı) hem de çalıştırmak için izin vermek için bir yük dengeleyici kullanma hakkında var aynı sunucu.

Sen az bellek veya CPU kullanımı ile çok ölçeklenebilir bir Comet tabanlı sohbet sistemi uygulamak için Nginx ve JavaScript kullanabilirsiniz.

Ben başlamak ki burada çok basit bir örnek var. Bu NHPM modülü ile Nginx derleme kapsar ve jQuery, PHP, ve Bash basit yayıncı / abone roller için kod içerir.

http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/

A working example (simple chat) can be found here:
http://cheetah.jamieisaacs.com/

PHP

Ben bu komik küçük screencasts basit kuyruklu açıklayan bulundu. Bir yan not olarak ben gerçekten bu gerçek yüke sunucu öldürecek düşünüyorum. Sadece kullanıcıların bir çift olan zaman, ben sadece bu çözüm için gitmek söyleyebilirim. Bu çözüm (Screencasts sadece :) zaman 5 dakika sürer) uygulamak için gerçekten çok basittir. Ama ben daha önce söylüyordum olarak ben (gerekir kriter bunu Guess ;)) eşzamanlı kullanıcıların bir sürü için iyi olduğunu düşünmüyorum, çünkü:

  1. Bu sadece bellekten veri alma sonra çok daha yavaş olan I / O dosyasını kullanır. Gibi, örneğin işlevleri filemtime(),
  2. İkinci olarak, ama en azından PHP yok sanmıyorum, bir iyi bir iş parçacığı modeli var. PHP çünkü share nothing model içinde zaten bunun için tasarlanmış değildi. Slaytlar gibi örnek MySQL gibi "Paylaşılan veriler veri deposu katmanı aşağı itti" diyor.

Alternatives

Ben gerçekten herhangi bir uzun / kuyrukluyıldız yoklama yapmak istiyorsanız alternatifleri denemek gerektiğini düşünüyorum. Örneğin gibi birçok dilde kullanabilirsiniz:

  • Java / JVM: Dalgakıran continuations.
  • Python: Dustin adlı slosh.
  • Erlang: kuyrukluyıldız / etc için popüler bir dil.
  • Lua, Ruby, C, Perl, sadece birkaç isim.

Sadece basit bir google arama yapmak, aynı zamanda PHP (herhangi büyük bir yük üzerinde düşünmek hangi sunucu öldürecek) size bir sürü alternatifler gösterir.

mod_php PHP kullanmak için tek yol değildir. Sen fastcgi kullanabilirsiniz. PHP --enable-fastcgi ile derlenmiş olmalıdır.

FastCGI olarak PHP: http://www.fastcgi.com/drupal/node/5?q=node/10

Ben benzer bir sorunu yaşıyorum. Ben enteresan buluyorum tek bir seçenek temel mesaj merkezi olarak, cometd-java veya cometd-piton gibi, varolan Comet sunucusu kullanmaktır. PHP kodu ardından Comet sunucuya sadece bir istemci - tıpkı diğer müşteriler gibi kanalları iletileri gönderebilir veya okuyabilirsiniz.

Burada bağlantılı ilginç bir kod parçacığı var: Bu yöntemin bölümünü uygulayan http://morglog.org/?p=22=1 O (yayılmış ayıklama kod parçaları da olmasına rağmen).

Ben soket işlevlerini kullanarak bir ölçeklenebilir PHP Comet sunucusu uygulamayı geçerli değilim. Bu ([ph] s com [et]) 'phet' denir

Proje sayfası: http://github.com/Tim-Smart/phet

Ücretsiz geliştirme katılmak ücretsiz. Şu anda sadece istemci tarafı şeyler bitirmek için gereken yapılır, sunucu mantığı çoğu almak başardı.

EDIT: Son zamanlarda pcntl_fork yöntemini kullanarak 'Multi-threading' yetenekleri eklendi :)

Bunu doğasında olan tek-parçacıklı-lık Sadece nedeniyle, PHP kuyrukluyıldız uygulanması zor bir zaman olacak.

Hizmet ağır eşzamanlı bağlantı eşyalarını boşaltma, sunucu tarafında yayın yoluyla PHP entegre sağlar ve hiçbir zaman gerçek-zamanlı sohbet uygulaması oluşturmak izin verir - Websync On-Demand göz atın.

Ayrıca https://github.com/reactphp/react deneyebilirsiniz

Tepki PHP olay güdümlü programlama için düşük seviyeli bir kütüphanedir. Süreçleri ile Akarsular soyutlama, uyumsuz dns çözümleyici, ağ istemci / sunucu, http istemci / sunucu, etkileşimi: Özünde bu gibi düşük seviye araçları, sağlayan üstüne bir olay döngü vardır. Üçüncü parti kütüphaneleri uyumsuz ağ istemcileri / sunucuları ve daha fazlasını oluşturmak için bu bileşenleri kullanabilirsiniz.

Olay döngü reaktör desen (dolayısıyla adı) dayalı ve güçlü bir şekilde EventMachine (Yakut), Twisted (Python) ve node.js (V8) olarak kütüphaneler esinlenmiştir.

Tanıtım örnek port 1337 dinleme basit bir HTTP sunucusu gösterir:

<?php

$i = 0;

$app = function ($request, $response) use (&$i) {
    $i++;

    $text = "This is request number $i.\n";
    $headers = array('Content-Type' => 'text/plain');

    $response->writeHead(200, $headers);
    $response->end($text);
};

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop);
$http = new React\Http\Server($socket);

$http->on('request', $app);

$socket->listen(1337);
$loop->run();

Yeni bir modül sadece PHP dahil olmak üzere herhangi bir dil ile Comet izin verirsiniz nginx web sunucusu için dışarı çıktı.

http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/

PHP kendi sunucusu oluşturmak zorunda olacak. Apache / mod_php'yi hatta fastcgi kullanarak tüm ölçek olmaz. Bir kaç yaşındayım, ancak başlamak yapabilirsiniz:

PHP-Comet-Server: http://sourceforge.net/projects/comet/

Bunu her zaman çalışan apache parçacığı çok olan bir sorun olduğunu daha bir sorun olduğunu düşünüyorum. PHP (genellikle) yaptığı gibi aynı şekilde apache ile çalışır eğer herhangi bir dil ile mevcut olacaktır.