PHP'de iş parçacığı güvenli veya iş parçacığı güvenli nedir?


773

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?


18
Yaklaşık on Güvenliği Konu okuyabilirsiniz en.wikipedia.org/wiki/Thread_safety : PHP İlişkin PHP mi evreli Do Lies Believe: PHP Konu Güvenli Henüz değil mi PHP iplik güvenli ve non parçacığı güvenli binarie arasındaki fark var bol miktarda kaynak mevcut. Burada Stackoverflow veya Google'da arama yapın.
TigerTiger

Yanıtlar:


668

Eşzamanlılık yaklaşımları için gerekli altyapı:

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 web sunucularıyla nasıl "bütünleştiği" konusunda gerekli arka plan:

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.

Şimdi, sorunuz üzerine!

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.

Son notlar

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 APIgirişi arayın . Bu CGI/FastCGIveya 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!


2
PHP-FPM iş parçacığı değil? Hızlı CGI nginx sunucularında kullanıldığından bu sorunu çözer.
Xeoncross

41
Harika detay, ben yıllardır PHP programlama ve bunu bilmiyordum.
Patrick

1
@Xeoncross: Genel olarak bu doğru ve pratikte PHP süreçlerini Apache dışında yönetmek için harika nedenlerden biri. Cevabımda bu konuya bakıyorum.
JM Becker

Burada tek sorun PHP-FPM'nin Windows altında bulunmamasıdır. En azından yerli bir yapı olarak.
Denis V

9
PHP'nin iş parçacığı güvenliği hala "çok tartışmalı" mı (2015 ve sürüm 7'de)?
Altiano Gerung

261

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.


1
greg cevabınız şöyle olmalıdır: "PHP'yi çalışanın MPM olduğu bir Apache modülü olarak kurmak istiyorsanız Thread Safe sürümü kullanılmalıdır"
wlf

9
yani php windows üzerinde xampp ile gelen NTS veya TS olduğunu?
Abudayah

1
PHP yerleşik web sunucusu kullanıyorsanız ne olur? Optimum performans için hangi PHP varyantı kullanılır?
Ariod

1
@Dario Bence bu sadece Windows.
Greg

1
@ChristopherShaw ahbap, cevap SADECE görüş içeriyor. ZTS'yi Apache modülüyle birlikte kullanmak için neden kaynak veya neden yoktur. Bu geçerli bir cevap değil. 217 kişi bile yanlış olabilir m8.
Daniel

30

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.


21

Gereğince PHP Belgeleri ,

PHP indirirken iş parçacığı güvenliği ne anlama geliyor?

İş 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.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Kazan / Unix)
  • Sybase-CT (Linux, libc5)
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.