PHP bir FastCGI uygulaması (php-cgi) olarak çalışan - eşzamanlı istekleri sorunu nasıl?

3 Cevap php

EDIT: Update - scroll down
EDIT 2: Update - problem solved


Some background information:

Java kendi web sunucusu yazıyorum ve bir kaç gün önce ben PHP ile Apache arayüzleri, bu yüzden PHP desteği uygulamak nasıl tam olarak SO sordu. (Mod_php bir seçenek değildir çünkü) FastCGI iyi yaklaşım olduğunu öğrendim. Yani FastCGI protokolü özellikleri baktım ve benim sunucu için bir çalışma FastCGI sarıcı yazmayı başardı. Ben phpinfo test ettik () ve çalışır, aslında tüm PHP fonksiyonları gayet iyi (gönderme veri, oturumlar, tarih / saat, vs vs) çalışmak gibi görünüyor.

Benim Webserver tamamlamış veya müşteri ile kullanıcı bağlantı zaman sonlandırma her kullanıcı isteği için yeni bir Java konu (yumurtlama yapar, (yani user1 some_large_binary_file.zip talep birey2 olarak aynı anda file1.html alabilirsiniz) eşzamanlı istekleri hizmet edebilir ) iptal edilir.

Ancak, aynı anda 2 (veya daha fazla) FastCGI istekleri ile baş edemez. Ne yapar bu onları kuyruklar olduğunu, bu nedenle talebi 1 hemen sonra tamamlandığında bu istek 2 işlemeye başlar. I 2 PHP sayfaları ile bu test, bir uyku (10) ve diğer phpinfo () içerir.

Ben bu yapılabilir (IIS altında PHP FastCGI olarak çalışır ve sadece iyi çoklu istekleri ile başa çıkabilirim) bildiğiniz gibi Nasıl birden istekleri ile uğraşan hakkında gitmek istiyorum.

Some more info:

Ben windows altında kodlama yaşıyorum ve php-cgi.exe yürütmek için kullanılan benim toplu dosyası içerir:

set PHP_FCGI_CHILDREN=8
set PHP_FCGI_MAX_REQUESTS=500
php-cgi.exe -b 9000

Ama 8 çocuk yumurtlamaya değil, hizmet sadece 500 istekleri sonra sona erer.

Ben araştırma yaptım ve gelen Wikipedia adres:

Processing of multiple requests simultaneously is achieved either by using a single connection with internal multiplexing (ie. multiple requests over a single connection) and/or by using multiple connections

Şimdi açıkça çoklu bağlantıları her şey gibi bir istemci FastCGI uygulamasına yeni bir yuva oluşturur, fakat (bunun yerine onları sıraya dizer) aynı anda çalışmıyor FastCGI içerir bir şey istediğinde, benim için çalışmıyor.

I know that internal multiplexing of FastCGI requests under the same connection is accomplished by issuing each unique FastCGI request with a different request ID. (also see the last 3 paragraphs of 'The Communication Protocol' heading in this article).

Ben bu test değil, ama nasıl bu uygulama hakkında gitmek istiyorsunuz? Ben bazı tür bir Harita ve istekleri eklemek için kullanabileceğiniz bir statik işlev içeren FastCGI Java iplik çeşit ihtiyaç götürün. Sonra Konudaki en run () fonksiyonu, bir süre döngü olurdu ve onlara bir istek kimliği atar ve FastCGI akışına bunları yazmak istiyorum eğer öyleyse her döngüsü için, Harita yeni istekleri içerip içermediğini kontrol olur. Ve sonra bu çok karmaşık hale görebileceğiniz gibi, giriş vs vs için bekleyin.

Herkes bunu doğru bir yol biliyor mu? Ya da hiç bir düşünce? Çok teşekkürler.

Note, if required I can supply the code for my FastCGI wrapper.


Update:

Temelde, ben nginx indirilen ve bir FastCGI uygulaması olarak PHP kullanmak üzere kurmak ve benim de sunucu olarak aynı sorunu yaşadı. Eşzamanlı PHP istekleri beceremedi. Bu benim kod aslında doğru olduğuna inanmak bana yol açar. Yani bir şey PHP ile yanlış ya da ben doğru kurma değilim. Bazı lighttpd'nin kullanıcıların Windows (bu çok mantıklı değil) düzgün FastCGI işleyemez iddia çünkü Windows kullanıyorum çünkü Belki de öyledir. Ben bazen yakında Linux kurmak ve o herhangi bir ilerleme rapor edeceğiz.

3 Cevap

Tamam, ben sorunun nedenini bulmak için başardı. Bu hiç benim kod değildi. Ben sadece benim linux kutusuna IP benim sunucu işaret ve eşzamanlı FCGI istekleri ile hiçbir sorunları vardı, Linux altında mükemmel çalışıyor, FastCGI modu olarak çalıştırırken Windows altında ek php-cgi yumurtası değil, PHP bulunuyor. Berbat, ama ben o kadar yolu sanırım ...

Bundan sonra PHP kaynak koduna derin bakmak ve PHP_FCGI_CHILDREN yanıt kod bölümünde Yani geliştiriciler sorunun farkında olmalıdır WIN32 ifndef no kapsüllü olmuştur bulundu vermedi

re: spawn-php python komut dosyası ...

Thanks @nosam that really helped.
For those wanting to get it working quickly you'll need the following (if 64bit system)

ActivePython-2.7.2.5-Win64-x64.msi
pywin32-217.win amd64 py2.7.exe

Eğer (bol dışarı orada) bir çalışma aynayı bulmak için etrafında Googling biraz yapmak gerekir böylece ActivePython onların www bu eski sürümleri yok

Eğer bitbucket gelen src indirdikten sonra bit-kova çalışmasını engelleyen dosyasında pisliği sekmenin gibiydi olarak, (sekme boşluğu düzeltmek için) spawn-php.py düzenlemeniz gerekebilir.

All-in-tüm nginx + hızlı-cgi kullanarak yoğun bir küçük pencere web sitesi için benim gün kurtardı.

Teşekkürler dostum!

Merhaba bu biraz geç geliyor, ben pencere, mükemmel değil php-cgi.exe için bir yumurtlayan yazmıştım ama ne gerekli olabilir. here kontrol et.