Menerapkan multi-threading di PHP? Melihat judul ini pasti mengira saya gila... Tapi nyatanya saya benar-benar melakukannya.
Berikut
beberapa metode saya yang sudah teruji
bahwa PHP sendiri tidak mendukung multi-threading, tetapi server WEB kami mendukung multi-threading.
Dengan kata lain, dapat diakses oleh banyak orang secara bersamaan. Hal ini juga menjadi dasar bagi saya untuk mengimplementasikan multi-threading di PHP Asumsikan
kita sedang menjalankan file a.php sekarang. Tapi saya juga meminta server WEB untuk menjalankan b.php lain di program tersebut
, sehingga kedua filetersebut
akan dieksekusi secara bersamaan
dikirim, server WEB akan mengeksekusinya, terlepas dari apakah klien telah keluar. )
Terkadang
, yang ingin kita jalankan bukanlah file lain, tetapi bagian dari kode dalam file ini
dapat menggunakan parameter untuk mengontrol program mana yang dijalankan a.php.
Berikut ini contohnya:
//a .php
Kode PHP: ------------------------------------------------ - ----------------------------------
<?php
fungsi menjalankanThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //Parameter kedua di sini adalah header permintaan yang ditentukan dalam protokol HTTP
//Jika belum paham, silakan lihat definisinya di RFC
fclose($fp);
}
fungsi a()
{
$fp = fopen('hasil_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
fungsi b()
{
$fp = fopen('hasil_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['bertindak'] == 'a')
{
jalankanThread();
A();
}
else if($_GET['bertindak'] == 'b') b();
?>
------------------------------------------------ --------------------------------
Buka result_a.log dan result_b.log dan bandingkan waktu akses kedua file. Anda akan menemukan bahwa keduanya memang berjalan di thread yang berbeda.
Beberapa kali sama persis.
Di atas hanyalah contoh sederhana, dan Anda dapat memperbaikinya ke dalam bentuk lain.
Sekarang multi-threading tersedia di PHP, muncul masalah yaitu sinkronisasi. Kita tahu bahwa PHP sendiri tidak mendukung multi-threading, jadi tidak ada metode seperti
sinkronisasi di Java 1.
Cobalah untuk tidak mengakses sumber daya yang sama untuk menghindari konflik. Namun Anda dapat mengoperasikan database secara bersamaan. Karena database mendukung operasi bersamaan,jangan menulis data ke file yang sama
dalam PHP multi-thread
ingin menulis, gunakan metode lain untuk sinkronisasi. Misalnya, panggil kawanan untuk mengunci file, dll. Atau buat file sementaradan tunggu hingga file hilang di thread lain while(file_exits('xxx')); setara dengan Ketika file sementara ini ada, berarti thread tersebut benar-benar beroperasi
. Jika tidak ada file tersebut, berarti thread lain telah merilisnya.
2. Cobalah untuk tidak membaca data dari soket ini setelah runThread mengeksekusi fputs Untuk mencapai multi-threading, perlu menggunakan mode non-blocking, yaitu segera kembali ketika fungsi
seperti
fgets digunakan, sehingga akan ada masalah saat membaca dan menulis data bukan multi-threaded. Itu harus menunggu pengembalian di atas sebelum menjalankan.Program berikut. Jadi jika Anda perlu bertukar data, Anda akhirnya dapat menggunakan file atau data eksternal untuk menyelesaikannya. $fp) untuk mencapainya.
Setelah mengatakan begitu banyak, apakah ini memiliki arti praktis? Kapan perlu menggunakan metode ini?
Jawabannya adalah ya. Seperti yang kita ketahui, dalam aplikasi yang terus-menerus membaca sumber daya jaringan, kecepatan jaringan adalah Hambatan mengadopsi metode ini, Anda dapat
membaca halaman berbeda dengan banyak thread secara bersamaan.
Saya membuat program yang dapat mencari informasi dari situs mall seperti 8848 dan soaso. Ada juga program yang membaca informasi bisnis dan direktori perusahaan dari situs Alibaba dan juga menggunakan
teknologi ini. Karena kedua program harus terus terhubung ke servernya untuk membaca informasi dan menyimpannya ke database. Memanfaatkan teknologi ini menghilangkan hambatan dalam menunggu respons.