Saya melihat berbagai biner untuk PHP, seperti bukan utas atau utas aman?
Apa artinya ini?
Apa perbedaan antara paket-paket ini?
Saya melihat berbagai biner untuk PHP, seperti bukan utas atau utas aman?
Apa artinya ini?
Apa perbedaan antara paket-paket ini?
Jawaban:
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.
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.
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.
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 API
entri. Ini bisa mengatakan sesuatu seperti CGI/FastCGI
atau 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!
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.
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.
Sesuai Dokumentasi 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.