Pertama..
Tidak, itu bukan thread yang sebenarnya , sesuai definisi CS, tetapi Anda benar-benar tidak dapat membedakannya. Saya akan begini - Perpustakaan ini lebih mirip dengan rasa threading yang sebenarnya daripada patty hamburger "McPlant" baru McDonalds dengan daging sapi. ?
Jika Anda seperti saya, Anda menyukai PHP! Anda menyukai fleksibilitas dan kekuatan bahasanya - kebebasan untuk menulis kode yang ceroboh (saya tidak menganjurkannya, tapi saya akan membela sampai mati hak untuk menulis kode yang ceroboh), atau untuk menciptakan karya seni logika yang sangat indah! Sekarang, untuk semua programmer C (dan C++, menurut saya), Anda memiliki perpustakaan yang tidak hanya benar-benar memamerkan kekuatan PHP, tetapi juga untuk meningkatkan proyek Anda berikutnya!
Pustaka ini memungkinkan Anda melakukan proses paralel dengan sangat efisien dengan cara yang sangat mirip dengan multithreading POSIX. Anda dapat berbagi variabel global antara semua phpthreads , meneruskan nilai/objek/array ke PHPTHread Anda saat pembuatan, berbagi nilai/objek/array dengan mudah antara menjalankan phpthreads , dan menerima nilai keluar/objek/array PHPThread ketika setiap PHPThread berakhir melalui phpthread_join()
keluarga fungsi.
Saya merancang perpustakaan ini karena saya ingin membuat server WebSocket berkinerja tinggi untuk dengan mudah menangani ribuan koneksi simultan yang melaluinya sejumlah besar data dapat ditransfer dengan cepat (pikirkan gambar atau video). Ya, pada dasarnya, ini adalah server fork()
, tetapi lapisan PHPThread di atasnya membuatnya sangat mudah untuk diterapkan sambil menyediakan mekanisme untuk IPC yang mudah (dan seperti thread). Saya bisa saja menggunakan C dan mendapatkan performa yang lebih baik, namun bagi saya, ini tampak lebih portabel dan mudah diterapkan saat server diputar, jadi sekarang inilah saatnya.
Bagi Anda yang lebih teknis, perpustakaan ini untuk sementara tidak terhalang oleh kebutuhan untuk menggunakan "centang". Itulah bagian yang membuatnya begitu cepat. Pustaka menggunakan sinyal (misalnya SIGUSR1 dan SIGUSR2) secara internal untuk menghentikan eksekusi dan mengalihkan konteks dengan sangat lancar. Ya, kami memonopoli SIGUSR1 dan 2, jadi jika proyek Anda menggunakan sinyal tersebut, pertimbangkan untuk menggunakan phpthread_send_message()
ke fungsi pengendali pesan yang ditunjuk (lihat: example/messages1.php dan example/messages2.php). Itu harus sepenuhnya sesuai dengan tujuan Anda.
Ada beberapa contoh yang dapat Anda jalankan di direktori "contoh". Jangan ragu untuk menempatkan shebang agar mudah dieksekusi, atau jalankan dengan mengawalinya dengan php <filename>
. Saya belum menyelesaikan semuanya, tetapi saya sudah menyelesaikan banyak di antaranya. Setidaknya cukup untuk mendapatkan pemahaman yang baik tentang kemampuannya.
phpthreads memerlukan ekstensi PHP berikut:
<?php
require_once '../lib/phpthread.php'; /* Use correct path! */
function thread_proc( $thread,
$param)
{
echo "nt[PHPTHREAD] - I've started and have a param: "" . print_r($param, true) . ""!n";
for ($i = 0; $i < 15; $i++) {
usleep(1000000);
echo "t[PHPTHREAD] - Tick!n";
}
$myobj = (object)array(
'seconds_alive'=>$i,
'lucky_number'=>rand(0, 10000)
);
echo "nt[PHPTHREAD] - I'm returning this:n";
print_r($myobj);
echo "n";
echo "<--------------------------------------->nn";
return $myobj;
}
$id = phpthread_create($phpthread, array(), "thread_proc", null, array("this awesome string!"));
for ($i = 0; $i < 5; $i++) {
echo "n[MAIN] - Doing my thing...n";
usleep(1000000);
}
echo "n[MAIN] - Okay, I'm tired. Waiting on child to quit.n";
phpthread_join($id, $retval);
echo "n[MAIN] - Child is done. It returned:n";
print_r($retval);