PHP Komut Dosyasına Eşzamanlı İstekler


86

PHP Motoru zaten sunucuda bir komut dosyası çalıştırmanın ortasındaysa, aynı betiğe aynı anda yapılan diğer tarayıcı isteklerine ne olur?

  • İstekler sıraya alınacak mı?
  • Göz ardı edilecekler mi?
  • Her isteğin kendi komut dosyası örneği olacak mı?
  • Başka bir olasılık var mı?

1
Ayrıca şu yanıtı kontrol edin: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Yanıtlar:


141

Sunucu, yapılandırmasına bağlı olarak, genellikle aynı anda yüzlerce isteğe hizmet edebilir - Apache kullanılıyorsa, MaxClientsyapılandırma seçeneği şunu söyler:

MaxClientsYönergesi aynı anda sunulacak istek sayısını sınırlamak için kullanılır. Limiti
aşan tüm bağlantı girişimleri MaxClients, normalde ListenBacklog yönergesine göre bir sayıya kadar sıraya alınır.
Bir alt süreç farklı bir talebin sonunda serbest bırakıldığında, bağlantı hizmete sunulacaktır.


İki müşterinin aynı sayfayı talep etmesi bir sorun oluşturmaz.

Yani :

İstekler sıraya alınacak mı?

Hayır ; hariç:

  • bir yerde bazı kilitler vardır - örneğin, iki istek aynı istemciden geliyorsa ve PHP'de dosya tabanlı oturumlar kullanıyorsanız : bir komut dosyası yürütülürken oturum "kilitlenir", bu da sunucunun / istemcinin ilk istek tamamlanana kadar (ve dosyanın kilidi açılana kadar) beklemesi gerektiği anlamına gelir. dosyayı ikinci kullanıcı için oturumu açmak üzere kullanabilmek için .
  • istekler aynı istemciden VE aynı tarayıcıdan gelir; çoğu tarayıcı, bu davranışı sunucu tarafında üreten hiçbir şey olmasa bile, bu durumda istekleri sıraya koyar.
  • MaxClientsşu anda aktif süreçlerden daha fazlası var - Apache'nin kılavuzundan hemen önceki alıntıya bakın.


Göz ardı edilecekler mi?

Hayır: bu, aynı anda yalnızca bir kullanıcının web sitesini kullanabileceği anlamına gelir; bu pek hoş olmaz değil mi?

Durum böyleyse, aynı anda F5'e basarsanız birinin cevap verip vermediğini görmek için bu cevabı gönderemezdim!
(Eh, SO PHP'de yoktur, ancak prensipler aynıdır)


Başka bir olasılık var mı?

Evet ^^


OP'yi ve yorumu düzenledikten sonra düzenleyin:

Her isteğin kendi komut dosyası örneği olacak mı?

" Komut dosyası örneği " diye bir şey yoktur : Basitçe söylemek gerekirse, bir komut dosyası için bir istek yapıldığında olan şey şudur:

  • web sunucusu , isteği yerine getirmek için başka bir işlemi zorlar (genellikle performans nedenlerinden ötürü bu çatallar önceden yapılır, ancak bu hiçbir şeyi değiştirmez)
  • işlem PHP betiğini diskten okur
    • bunu aynı anda birkaç işlem yapabilir : dosya okumada kilitleme yoktur
    • dosya belleğe yüklenir; her işlem için ayrı bir bellek bloğunda
  • bellekteki PHP dosyası işlem kodlarına " derlenir " - hala bellekte
  • bu işlem kodları yürütülür - yine de isteğinizi yanıtlayan işleme ait olan bellek bloğundan


Gerçekten, iki kullanıcının aynı PHP betiğine (veya hepsi aynı PHP dosyasını içeren farklı PHP betiklerine) istek göndermesini sağlayabilirsiniz ; Bu kesinlikle bir sorun değil, ya da üzerinde çalıştığım hiçbir web sitesi işe yaramaz!


Birden fazla eşzamanlı istek aynı php dosyasına erişiyorsa, sonuç ne olur? diğer istekler beklemede tutulacak mı yoksa her isteğin kendi komut dosyası örneği olacak mı?
Kevin Boyd

3
"Komut dosyası örneği" diye bir şey yoktur: her istek ayrı bir işlem (veya iş parçacığı) tarafından işlenir; komut dosyaları bellekten / diskten okunur, ancak aynı dosya birçok işlemden aynı anda sorunsuz olarak okunabilir (en azından "modern" işletim sistemlerinde - yani hem Windows hem de Linux'ta)
Pascal MARTIN

Bu mükemmel bir cevap, PHP'nin nasıl çalıştığı hakkında daha fazla bilgiyi nereden öğrenebilirim? Bunun için iyi bir kitap var mı?
Kevin Boyd

1
Bunu gerçekten bilmiyorum: Tahminimce el kitabını gözden geçirmek, internette makaleler okumak, burada ve orada sorular / cevaplar okumak ve birkaç yıl PHP ile çalışmak öğrenmek için güzel bir yol - ama yapabilirim ' t PHP'nin tam olarak nasıl çalıştığını açıklayan herhangi bir kitabı gerçekten tavsiye etmiyor ;; "PHP'yi Genişletme ve Gömme" konusunda bazı bilgiler vardır, ancak konusu PHP'nin nasıl çalıştığını açıklamak değildir; belki php.net/manual/en/internals2.php yardımcı olabilir?
Pascal MARTIN

Mükemmellik! Bana çok yardım etti !
zookastos

21

2 istemci sunucuyu aynı anda ararsa, sunucu büyük olasılıkla her iki istemciye de neredeyse aynı anda yanıt verebilir. Buradaki istemcileri tarayıcı düzeyinde tanımlıyorum.

Yani aynı makinede aynı web sitesini / sayfayı aynı anda yüklemek için 2 tarayıcı kullanıyorsanız, her ikisinin de aynı anda yüklenmesi gerekir.

ancak PHP hakkında konuştuğumuz için, oturumlar hakkında özel notlar almanız gerekir. Sayfalarınız oturumlar kullanıyorsa, sunucu bir seferde yalnızca bir sayfa sunar. Bunun nedeni, bir komut dosyası çıkana kadar oturum dosyasının kilitlenmesidir.

Bu örneğe bakın. 2 dosya aynı oturumdan, yani aynı tarayıcıdan yüklenir.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Scriptb.php'nin yalnızca scripta.php sunulduktan sonra başlatıldığına dikkat edin. bunun nedeni, scripta.php başladığında, oturum dosyasının diğer betiklere kilitlenmesidir, böylece scripta.php, oturum dosyasına yazabilir. Scripta.php tamamlandığında, oturum dosyasının kilidi açılır ve böylece diğer betikler onu kullanabilir. Bu nedenle scriptb.php oturum dosyası serbest kalana kadar bekleyecek ve ardından oturum dosyasını kilitleyecek ve kullanacaktır.

Bu işlem, birden çok komut dosyasının aynı oturum dosyasına yazmasının gecikmelere neden olmasını önlemek için tekrar etmeye devam edecektir. Bu nedenle session_write_close, oturumu artık kullanmadığınız zamanlarda, özellikle de çok sayıda iframe veya AJAX kullanan bir web sitesinde () çağrısı yapmanız önerilir .


4

Bununla kendim karşılaştım. Temel olarak, session_write_close()tek bir kullanıcının kilitlenmesini önlemek için aramanız gerekir . Bir kez aradığınızda, session_write_close()herhangi bir oturum değişkenini değiştirmeye çalışmadığınızdan emin olun . Onu aradıktan sonra oturumları o andan itibaren salt okunur olarak ele alın.


3

Çok standart olmayan bir kurulum çalıştırmıyorsanız, web sunucunuzda (Apache, IIS, nginx, vb.), Sunucuya gelen her istek için PHP'yi ayrı ayrı çalıştıran birden çok işlem olacaktır. Eşzamanlı isteklere aynı anda hizmet verilecektir.

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.