Ben iş parçacığı olmayan veya iş parçacığı güvenli gibi PHP için farklı ikili gördüm?
Ne anlama geliyor?
Bu paketler arasındaki fark nedir?
Ben iş parçacığı olmayan veya iş parçacığı güvenli gibi PHP için farklı ikili gördüm?
Ne anlama geliyor?
Bu paketler arasındaki fark nedir?
Yanıtlar:
Farklı web sunucuları, gelen HTTP isteklerini paralel olarak ele almak için farklı teknikler uygular. Oldukça popüler bir teknik iş parçacıkları kullanıyor - yani, web sunucusu gelen her istek için tek bir iş parçacığı oluşturur / ayırır. Apache HTTP web sunucusu, istekleri işlemek için birden fazla modeli destekler (bunlardan biri (çalışan MPM olarak adlandırılır) iş parçacıkları kullanır). Ancak, süreçleri kullanan prefork MPM adı verilen başka bir eşzamanlılık modelini destekler - yani, web sunucusu her istek için tek bir işlem oluşturur / atar.
Ayrıca tamamen farklı eşzamanlılık modelleri (Asenkron prizler ve G / Ç kullanarak) ve iki veya üç modeli bir araya getiren modeller de vardır. Bu soruyu cevaplamak amacıyla, yalnızca yukarıdaki iki modelle ve Apache HTTP sunucusunu örnek olarak ele alıyoruz.
PHP'nin kendisi gerçek HTTP isteklerine yanıt vermez - bu web sunucusunun işidir. Bu nedenle web sunucusunu, istekleri işlenmek üzere PHP'ye iletecek şekilde yapılandırırız, ardından sonucu alır ve kullanıcıya geri göndeririz. Web sunucusunu PHP ile zincirlemenin birçok yolu vardır. Apache HTTP Sunucusu için en popüler olanı "mod_php" dir. Bu modül aslında PHP'nin kendisidir, ancak web sunucusu için bir modül olarak derlenmiştir ve böylece içine yüklenir.
PHP'yi Apache ve diğer web sunucularıyla zincirlemek için başka yöntemler de vardır, ancak mod_php en popüler olanıdır ve ayrıca sorunuzu cevaplamaya hizmet edecektir.
Barındırma şirketleri ve GNU / Linux dağıtımları bizim için hazırlanan her şeyle birlikte geldiğinden, bu ayrıntıları daha önce anlamanız gerekmeyebilir.
Mod_php ile PHP doğrudan Apache'ye yüklendiğinden, Apache Çalışan MPM'sini (yani, Threads kullanarak) eşzamanlılığı ele alacaksa, PHP aynı çok iş parçacıklı ortamda çalışabilmelidir - yani, PHP'nin Apache ile doğru bir şekilde top oynayabilmek için ipliğe güvenli olun!
Bu noktada, "Tamam, bu yüzden çok iş parçacıklı bir web sunucusu kullanıyorsam ve PHP doğrudan içine gömmek için gidiyoruz, o zaman PHP iş parçacığının güvenli sürümünü kullanmak gerekir" düşünüyor olmalısınız. Ve bu doğru düşünme olurdu. Ancak, olduğu gibi PHP'nin iş parçacığı güvenliği tartışmalıdır . Bu, gerçekten ne yaptığını bilirsen işe yarar bir zemin.
Merak ediyorsanız durumda, benim kişisel tavsiyem olacaktır değil bir seçim varsa çok dişli bir ortamda PHP kullanın!
Sadece Unix tabanlı ortamlardan bahsetmişken, neyse ki, bunu sadece Apache web sunucusu ile PHP kullanacaksanız düşünmeniz gerektiğini söyleyebilirim, bu durumda Apache'nin prefork MPM'si ile ( iş parçacığı kullanmaz ve bu nedenle PHP iş parçacığı güvenliği önemli değildir) ve bildiğim tüm GNU / Linux dağıtımları, paket sisteminden Apache + PHP'yi yüklerken bile size sormadan bu kararı alacaktır. bir seçim için. Eğer nginx veya lighttpd gibi diğer web sunucularını kullanacaksanız , PHP'yi bunlara gömme seçeneğiniz olmayacaktır. FastCGI veya PHP'nin tamamen dışarıda olduğu farklı bir modelde çalışan eşit bir şey kullanmaya bakacaksınız.Örneğin FastCGI aracılığıyla istekleri yanıtlamak için kullanılan birden çok PHP işlemine sahip web sunucusunun Bu gibi durumlarda, iplik güvenliği de önemli değildir. Web sitenizin hangi sürümü kullandığını görmek için sitenize içeren bir dosya koyun <?php phpinfo(); ?>
ve Server API
girişi arayın . Bu CGI/FastCGI
veya gibi bir şey söyleyebilir Apache 2.0 Handler
.
Ayrıca PHP'nin komut satırı sürümüne bakarsanız - iş parçacığı güvenliği önemli değildir.
Son olarak, iş parçacığı güvenliği o kadar önemli değilse hangi sürümü kullanmalısınız - iş parçacığı için güvenli veya iş parçacığı için güvenli değil mi? Açıkçası bilimsel bir cevabım yok! Ancak, iş parçacığı için güvenli olmayan sürümün daha hızlı ve / veya daha az arabası olduğunu tahmin edebilirim, aksi takdirde, yalnızca iş parçacığı için güvenli sürümü sunmuş ve bize seçim yapma zahmetine girmeyeceklerdir!
Benim için her zaman iş parçacığı olmayan güvenli sürümünü seçerim , çünkü her zaman nginx kullanıyorum veya komut satırından PHP çalıştırıyorum.
PHP'yi bir CGI ikili dosyası, komut satırı arabirimi veya yalnızca tek bir iş parçacığının kullanıldığı başka bir ortam olarak yüklerseniz, iş parçacığı olmayan güvenli sürüm kullanılmalıdır.
PHP'yi çalışan bir MPM'ye (çoklu işleme modeli) veya birden çok PHP iş parçacığının aynı anda çalıştığı başka bir ortama Apache modülü olarak yüklerseniz iş parçacığı için güvenli bir sürüm kullanılmalıdır.
Modphp'li Apache MPM prefork, yapılandırılması / yüklenmesi kolay olduğu için kullanılır. Performans açısından oldukça verimsizdir. Yığın yapmayı tercih ettiğim yol, FastCGI / PHP-FPM. Bu şekilde çok daha hızlı MPM Çalışanı'nı kullanabilirsiniz. PHP'nin tamamı iş parçacığı olmadan kalır, ancak Apache iş parçacığı (gerektiği gibi) işlenir.
Temel olarak, aşağıdan yukarıya
Linux
Apache + MPM Çalışanı + ModFastCGI (FCGI DEĞİL) | (veya) | Cherokee | (veya) | nginx
PHP-FPM + APC
ModFCGI, PHP-FPM'yi veya harici FastCGI uygulamalarını doğru bir şekilde desteklemez. Yalnızca işlem dışı yönetilen FastCGI komut dosyalarını destekler. PHP-FPM, PHP FastCGI süreç yöneticisidir.
Gereğince PHP Belgeleri ,
İş Parçacığı Güvenliği, ikili dosyanın Windows'ta Apache 2 gibi çok iş parçacıklı bir web sunucusu bağlamında çalışabileceği anlamına gelir. İş Parçacığı Güvenliği, her iş parçacığında yerel bir depolama kopyası oluşturarak çalışır, böylece veriler başka bir iş parçacığına çarpmaz.
Peki ne seçeceğim? PHP'yi bir CGI ikili dosyası olarak çalıştırmayı seçerseniz, ikili dosya her istekte çağrıldığından iş parçacığı güvenliğine ihtiyacınız olmaz. IIS5 ve IIS6 gibi çok iş parçacıklı web sunucuları için PHP'nin iş parçacıklı sürümünü kullanmalısınız.
Aşağıdaki Kütüphaneler iş parçacığı için güvenli değildir. Çok iş parçacıklı bir ortamda kullanılması önerilmez.