Multithreading dalam PHP tidak ada "di luar kotak", jadi banyak sekali opsi yang ditemukan untuk implementasinya, termasuk ekstensi
pthreads ,
AzaThread (CThread), dan bahkan beberapa perkembangan pengembang PHP
sendiri .
Kerugian utama bagi saya adalah terlalu banyak "bel dan peluit" untuk solusi ini - tidak selalu ada kebutuhan untuk pertukaran informasi antara utas dan proses induk atau untuk menghemat sumber daya. Harus selalu ada kemampuan untuk menyelesaikan masalah dengan cepat dan hemat biaya.
Saya ingin membuat reservasi sebelumnya bahwa rahasia besar tidak terbuka di pos ini - ini lebih cenderung untuk pemula dalam bahasa ini, dan saya memutuskan untuk menerbitkannya hanya karena saya sendiri mengalami masalah dan, setelah tidak menemukan solusi yang sudah jadi, saya membuat semacam emulasi multithreading sendiri.
Jadi, tugasnya adalah memproses sejumlah besar data yang masuk ke skrip kami. Tugas saya adalah memproses array JSON dari informasi tekstual, mencerna yang mana skrip harus mengumpulkan darinya komit yang sama besar untuk PostgreSQL.
Pertama-tama, kami mengumpulkan data dalam file induk:
index.php
Ukuran array berfluktuasi sekitar 400mb (kemudian dikurangi menjadi ~ 50mb), dan semua informasi itu bersifat tekstual. Tidak sulit untuk memperkirakan kecepatan dengan mana semua itu dicerna, dan mengingat bahwa skrip dijalankan pada cron setiap 15 menit, dan kekuatan pemrosesan begitu-begitu - kinerjanya sangat menderita.
Setelah menerima data, Anda dapat memperkirakan volumenya dan, jika perlu, menghitung jumlah utas yang diperlukan untuk setiap inti CPU, atau Anda dapat memutuskan bahwa akan ada 4 utas dan menghitung jumlah baris untuk setiap utas:
index.php
Perlu disebutkan segera - perhitungan βlangsungβ seperti itu tidak akan memberikan hasil yang pasti dengan jumlah elemen untuk setiap aliran. Dibutuhkan lebih mungkin untuk menyederhanakan perhitungan.
Dan sekarang intinya - kita membuat tugas untuk setiap utas dan menjalankannya. Kami akan melakukan ini "dahi" - membuat tugas untuk file kedua - thread.php. Ini akan bertindak sebagai "aliran", menerima berbagai elemen untuk diproses dan mulai secara independen dari skrip utama:
index.php
Fungsi
passthru () digunakan untuk menjalankan perintah konsol, tetapi skrip akan menunggu masing-masing untuk menyelesaikannya. Untuk melakukan ini, kami membungkus perintah peluncuran dalam satu set pernyataan yang akan memulai proses dan segera mengembalikan apa-apa, memulai proses dan proses induk tidak akan berhenti menunggu setiap anak untuk mengeksekusi:
Apa yang sebenarnya terjadi di sini, sayangnya, saya tidak bisa mengatakan dengan pasti - satu set parameter disarankan kepada saya oleh Linuxoid yang saya kenal. Jika Anda dapat menguraikan sihir ini di komentar, saya akan berterima kasih dan akan menambah posting.
File thread.php:
$start = $argv[1]; $stop = $argv[2]; for ($i = $start; $i <= $stop; $i++) {
Dengan cara ini, cukup sederhana, Anda dapat menerapkan emulasi multithreading dalam PHP.
Jika kita mengurangi seluruh contoh untuk mengeringkan output, maka saya pikir akan terdengar seperti ini: induk thread melalui baris perintah meluncurkan proses anak, memberi tahu mereka informasi apa yang harus diproses.
Ketika saya mengatakan "emulasi", maksud saya bahwa dengan metode implementasi ini tidak ada cara untuk bertukar informasi antara utas atau antara induk dan anak utas. Sangat cocok jika diketahui sebelumnya bahwa fitur tersebut tidak diperlukan.