Nasıl sunucu bir anda farklı kullanıcının isteklerini yönetmek?

5 Cevap php

Eğer sunucu bir anda farklı http isteği nasıl işlediğini söyleyebilir. 10 kullanıcı bir sitede oturum ve aynı zamanda bir sayfa için istek göndermek durumunda ne olacak?

5 Cevap

Genellikle, kullanıcıların her sayfa için bir HTTP isteği gönderir. Sunucu farklı işçiler (süreçler ya da konuları) için istekleri ve delegeler onları alır.

Verilen URL'ye bağlı olarak, sunucu bir dosyayı okur ve kullanıcıya geri gönderir. Dosya böyle bir PHP dosyası olarak dinamik bir dosya ise geri kullanıcıya gönderecek önce, dosya yürütülür.

İstenen dosya geri gönderildikten sonra, sunucu genellikle birkaç saniye sonra bağlantıyı kapatır.

Daha fazla için bkz: HowStuffWorks Web Servers

HTTP kullanır TCP hangi bağlantı tabanlı bir protokoldür. Yani sunucusu ile iletişim yaparken istemcileri TCP bağlantısı kurmak değildir.

Birden fazla müşteri aynı anda aynı hedef makinede aynı hedef bağlantı noktasına bağlanmak için izin verilir. Sunucu sadece birden fazla eşzamanlı bağlantı açılır.

Apache (ve diğer birçok HTTP sunucuları) çoklu işleme modülü var (MPM). Bu bağlantıları işlemek için Apache konuları / işlemleri tahsis sorumludur. Bu işlemler veya iplikleri birbirlerini engelleme olmadan, kendi bağlantı paralel olarak çalıştırabilirsiniz. Apache MPM da hiçbir bağlantı açık olsa bile bir sonraki istekleri hızlandırmaya yardımcı olan açık, "yedek" konuları veya işlemleri tutmak eğilimindedir.

Apache ile geliyor (ApacheBench için kısa) Program ab Eğer seferde HTTP sunucusu birden fazla bağlantı açmak ne olur test etmenizi sağlar.

Apache yapılandırma dosyaları normal kabul edeceği eşzamanlı bağlantı sayısı için bir sınır koyacaktır. Bu normal çalışma sırasında bu sınıra ulaşıldığında asla böyle makul bir sayıya ayarlanır.

Müşteri potansiyel yaptıkları gereken eşzamanlı bağlantı sayısını azaltarak, bağlantıyı kapatmadan önce birden çok HTTP isteklerini yapmak, böylece (sürüm 1.1), HTTP protokolü, açık tutulması için bir bağlantı için izin verdiğini de unutmayın.

Apache MPM Daha:

Apache kendisi farklı multi-işleme modülleri bir dizi (MPM) kullanabilirsiniz. Gelen bağlantıları genellikle mevcut bir süreci gönderilebilir böylece Apache 1.x normalde, önceden Apache süreçlerin bir dizi oluşturur "prefork" adlı bir modül kullanılır. Yukarıda tarif edildiği gibi olmasıdır.

Apache 2.x normalde aynı şeyi elde etmek için (tek bir işlem içinde birden yürütme konuları çalıştıran) multithreading kullanır "işçi" olarak adlandırılan bir MPM kullanır. Ayrı süreçler üzerinde çoklu avantajı diş ayrı açma işlemlerini göre çok daha hafif olduğunu ve hatta biraz daha az bellek kullanmak olmasıdır. Çok hızlı.

Multithreading dezavantajı mod_php gibi şeyleri çalıştırmak olamaz. Eğer çoklu kullanım olduğunuzda, tüm eklenti kütüphaneler "iş parçacığı güvenli" olması gerekir - yani, bir çok iş parçacıklı ortamda çalışan farkında olmak gerekir. Bir çok-dişli uygulama yazmak zordur. Bir süreç içindeki payı konuları aralarında bazı bellek / kaynaklar, bu kolayca başka bir iş parçacığı yazma sürecinde, iplikler belleğe okumak veya yazmak yarış durumu hata oluşturabilir. Bu Dolaşarak gibi locking gibi teknikler gerektirir. Birçok PHP'nin yerleşik kütüphaneler değil güvenli parçacığı, yani mod_php'yi kullanmak isteyenler Apache "işçi" MPM kullanamazsınız.

Apache 2 çalışma iki farklı modu vardır. Bir a threaded server diğer "prefork" adı verilen bir mod kullanarak olarak çalışıyorsa (multiple processes).

Istekleri HTTP cini en iyi yeteneği, aynı anda işlenecektir.

Tipik olarak, HTTP cini çeşitli süreçler veya birkaç konuları da doğacaktır ve her biri bir istemci isteği idare edecek. Bir istemci bir istek yaptığında, o iplik / işlem yaratılacak için beklemek zorunda kalmaması Sunucu yedek Konuları / işlemleri devam edebilir. Daha hızlı bir şekilde işlenebilir, böylece her bir dişli / işlem, farklı bir işlemci ya da çekirdeğe eşlenebilir. Çoğu durumda, ancak, ne ağ ham bilgisayar I / O, değil eksikliği isteklerini tutar, yani bir seferde ele istekleri sayısının önemli ölçüde daha düşük işlemci / çekirdek bir dizi olan hiçbir yavaşlama orada sık sık.

Sunucusu (apache) aynı anda birden fazla program çalıştırmak, yani multi-threaded olduğunu. Birkaç yıl önce, tek bir CPU iki şey aynı anda oluyor olduğu görünümü vererek, hızlı bir şekilde birden parçacıkları arasında ileri ve geri geçiş olabilir. Bu gün, bilgisayarlar birden fazla işlemci var, bu yüzden bilgisayar aslında aynı anda iki kod konuları çalıştırabilirsiniz. Bu konuları gerçekten herhangi basit bir şekilde işlemciler eşlenmez, söyleniyor.

Bu yeteneği sayesinde, bir PHP programı yürütme tek bir iplik olarak düşünülebilir. Iki istekleri aynı anda sunucuya ulaşması halinde, iki iş parçacığı aynı anda isteği işlemek için kullanılabilir. Muhtemelen ikisi de CPU aynı miktarda alacak, bu yüzden aynı şeyi yapıyorsun, onlar yaklaşık aynı zaman tamamlayacak.

Tek bir kaynak, bunlardan biri için gidiyor eğer iki kişi, aynı şeyi (aynı şeyi yapmak için "yarış") yapıyorsun - çoklu iş parçacığı ile en yaygın konulardan biri "ırk koşulları" kazanmak. Ikisi de veritabanına bir kayıt eklerseniz, her ikisi de aynı kimliği alınamıyor - bunlardan biri kazanacak. Yani diğer istekleri aynı anda devam etmektedir ve dosya yazmak veya küresellerle değiştirmek, veritabanı değiştirebilir gerçekleştirmek için kod yazarken dikkatli olmak gerekir.

Söyleniyor, programlama modeli çoğunlukla bu karmaşıklığı göz ardı sağlar.