Apa itu thread safe atau non-thread safe di PHP?


774

Saya melihat berbagai biner untuk PHP, seperti bukan utas atau utas aman?

Apa artinya ini?

Apa perbedaan antara paket-paket ini?


18
Anda dapat membaca tentang Thread Safety di en.wikipedia.org/wiki/Thread_safety Mengenai PHP: Apakah PHP-safe thread Don't Believe The Lies: PHP Bukan Thread-Safe Namun Perbedaan antara PHP thread safe dan non thread safe binarie Ada tersedia banyak sumber daya. Cari di sini di Stackoverflow atau Google.
TigerTiger

Jawaban:


668

Diperlukan latar belakang tentang pendekatan konkurensi:

Server web yang berbeda menerapkan teknik berbeda untuk menangani permintaan HTTP yang masuk secara paralel. Teknik yang cukup populer adalah menggunakan utas - yaitu, server web akan membuat / mendedikasikan satu utas untuk setiap permintaan yang masuk. Server web Apache HTTP mendukung banyak model untuk menangani permintaan, salah satunya (disebut MPM pekerja) menggunakan utas. Tetapi mendukung model konkurensi lain yang disebut MPM prefork yang menggunakan proses - yaitu, server web akan membuat / mendedikasikan satu proses untuk setiap permintaan.

Ada juga model konkurensi yang sama sekali berbeda (menggunakan soket Asynchronous dan I / O), serta yang menggabungkan dua atau bahkan tiga model bersamaan. Untuk menjawab pertanyaan ini, kami hanya mementingkan dua model di atas, dan mengambil server HTTP Apache sebagai contoh.

Diperlukan latar belakang tentang bagaimana PHP "terintegrasi" dengan server web:

PHP sendiri tidak menanggapi permintaan HTTP sebenarnya - ini adalah tugas server web. Jadi kami mengkonfigurasi server web untuk meneruskan permintaan ke PHP untuk diproses, kemudian menerima hasilnya dan mengirimkannya kembali ke pengguna. Ada beberapa cara untuk menghubungkan server web dengan PHP. Untuk Apache HTTP Server, yang paling populer adalah "mod_php". Modul ini sebenarnya adalah PHP itu sendiri, tetapi dikompilasi sebagai modul untuk server web, dan karenanya dimuat tepat di dalamnya.

Ada metode lain untuk merantai PHP dengan Apache dan server web lainnya, tetapi mod_php adalah yang paling populer dan juga akan berfungsi untuk menjawab pertanyaan Anda.

Anda mungkin tidak perlu memahami detail-detail ini sebelumnya, karena perusahaan hosting dan distro GNU / Linux memiliki semua yang dipersiapkan untuk kami.

Sekarang, ke pertanyaan Anda!

Sejak dengan mod_php, PHP dimuat langsung ke Apache, jika Apache akan menangani konkurensi menggunakan MPM Pekerja (yaitu, menggunakan Thread) maka PHP harus dapat beroperasi dalam lingkungan multi-utas yang sama ini - artinya, PHP harus amankan utas untuk bisa bermain bola dengan benar dengan Apache!

Pada titik ini, Anda harus berpikir "OK, jadi jika saya menggunakan server web multi-threaded dan saya akan menanamkan PHP langsung ke dalamnya, maka saya harus menggunakan versi PHP thread-safe". Dan ini adalah pemikiran yang benar. Namun, seperti yang terjadi, keamanan thread PHP sangat diperdebatkan . Ini adalah tanah yang digunakan-jika-Anda-benar-benar-benar-tahu-apa-yang-Anda-lakukan.

Catatan akhir

Jika Anda bertanya-tanya, saran pribadi saya adalah jangan menggunakan PHP di lingkungan multi-utas jika Anda punya pilihan!

Berbicara hanya tentang lingkungan berbasis Unix, saya akan mengatakan bahwa untungnya, Anda hanya perlu memikirkan ini jika Anda akan menggunakan PHP dengan server web Apache, dalam hal ini Anda disarankan untuk pergi dengan prefork MPM of Apache (yang tidak menggunakan utas, dan oleh karena itu, keamanan utas PHP tidak masalah) dan semua distribusi GNU / Linux yang saya tahu akan mengambil keputusan itu untuk Anda ketika Anda menginstal Apache + PHP melalui sistem paket mereka, tanpa meminta Anda untuk suatu pilihan. Jika Anda akan menggunakan server web lain seperti nginx atau lighttpd , Anda tidak akan memiliki opsi untuk menanamkan PHP ke dalamnya. Anda akan melihat menggunakan FastCGI atau sesuatu yang setara yang bekerja dalam model berbeda di mana PHP benar-benar - luarserver web dengan beberapa proses PHP yang digunakan untuk menjawab permintaan melalui mis FastCGI. Untuk kasus seperti itu, keamanan benang juga tidak masalah. Untuk melihat versi mana yang digunakan situs web Anda, letakkan file yang berisi <?php phpinfo(); ?>di situs Anda dan cari Server APIentri. Ini bisa mengatakan sesuatu seperti CGI/FastCGIatau Apache 2.0 Handler.

Jika Anda juga melihat versi baris perintah PHP - keamanan thread tidak masalah.

Terakhir, jika keamanan utas tidak masalah, maka versi mana yang harus Anda gunakan - aman-utas atau non-utas-aman? Terus terang, saya tidak punya jawaban ilmiah! Tapi saya rasa versi non-thread-safe lebih cepat dan / atau kurang buggy, atau mereka hanya akan menawarkan versi thread-safe dan tidak mau repot-repot memberi kita pilihan!


2
Jadi PHP-FPM tidak di-threaded? Itu memecahkan masalah kemudian karena Fast CGI digunakan pada server nginx.
Xeoncross

41
Detail yang luar biasa, saya telah pemrograman dalam PHP selama bertahun-tahun dan tidak pernah tahu ini.
Patrick

1
@ Xeoncross: Secara umum itu benar, dan dalam praktiknya itu adalah salah satu alasan bagus untuk mengelola proses PHP di luar Apache. Saya membahas aspek ini dalam jawaban saya.
JM Becker

Satu-satunya masalah di sini adalah PHP-FPM tidak tersedia di Windows. Setidaknya sebagai bangunan asli.
Denis V

9
Apakah keamanan utas PHP masih "sangat diperdebatkan" (pada 2015 dan versi 7)?
Altiano Gerung

261

Bagi saya, saya selalu memilih versi yang tidak aman karena saya selalu menggunakan nginx, atau menjalankan PHP dari baris perintah.

Versi aman non-utas harus digunakan jika Anda menginstal PHP sebagai biner CGI, antarmuka baris perintah atau lingkungan lain di mana hanya satu utas digunakan.

Versi thread-safe harus digunakan jika Anda menginstal PHP sebagai modul Apache dalam MPM pekerja (model multi-pemrosesan) atau lingkungan lain di mana banyak thread PHP dijalankan secara bersamaan.


1
greg jawaban Anda seharusnya: "Versi Thread Safe harus digunakan jika Anda ingin menginstal PHP sebagai modul Apache di mana pekerja adalah MPM"
wlf

9
jadi php yang datang dengan xampp di windows adalah NTS atau TS?
Abudayah

1
Bagaimana jika Anda menggunakan server web bawaan PHP? Varian PHP manakah yang digunakan untuk kinerja optimal?
Ariod

1
@Dario, saya pikir itu hanya Windows.
Greg

1
@ChristopherShaw Bung, jawabannya berisi opini HANYA. Tidak ada sumber atau alasan MENGAPA untuk menggunakan ZTS dalam kombinasi dengan modul Apache. Itu bukan jawaban yang valid. Bahkan 217 ppl bisa salah m8.
Daniel W.

30

Apache MPM prefork dengan modphp digunakan karena mudah untuk mengkonfigurasi / menginstal. Dari segi kinerja, ini cukup tidak efisien. Cara pilihan saya untuk melakukan stack, FastCGI / PHP-FPM. Dengan begitu Anda bisa menggunakan MPM Worker yang jauh lebih cepat. Seluruh PHP tetap non-utas, tetapi Apache berfungsi utas (seperti seharusnya).

Jadi pada dasarnya, dari bawah ke atas

Linux

Apache + MPM Worker + ModFastCGI (BUKAN FCGI) | (atau) | Cherokee | (atau) | Nginx

PHP-FPM + APC

ModFCGI tidak benar mendukung PHP-FPM, atau aplikasi FastCGI eksternal. Ini hanya mendukung skrip FastCGI yang dikelola tanpa proses. PHP-FPM adalah manajer proses PHP FastCGI.


21

Sesuai Dokumentasi PHP ,

Apa arti keamanan utas saat mengunduh PHP?

Thread Safety berarti biner dapat bekerja dalam konteks server web multithreaded, seperti Apache 2 di Windows. Thread Safety bekerja dengan membuat salinan penyimpanan lokal di setiap utas, sehingga data tidak akan bertabrakan dengan utas lainnya.

Jadi apa yang saya pilih? Jika Anda memilih untuk menjalankan PHP sebagai biner CGI, maka Anda tidak perlu pengaman thread, karena biner dipanggil pada setiap permintaan. Untuk server web multithreaded, seperti IIS5 dan IIS6, Anda harus menggunakan versi PHP ulir.

Perpustakaan berikut tidak aman utas. Mereka tidak direkomendasikan untuk digunakan dalam lingkungan multi-utas.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.