首先..
不,根據 CS 定義,它們不是真正的線程,但您確實無法分辨出差異。我會這樣說 - 這個庫比麥當勞新的“McPlant”漢堡肉餅與牛肉更接近真正的螺紋感覺。 ?
如果你跟我一樣,你會喜歡PHP!你喜歡語言的靈活性和力量——編寫草率程式碼的自由(我不提倡,但我將誓死捍衛編寫草率程式碼的權利),或創造無可爭議的美麗邏輯藝術作品!現在,對於我所有的 C(我猜還有 C++)程式設計師來說,您擁有的程式庫不僅可以真正展示 PHP 的強大功能,還可以為您的下一個專案提供支援!
該程式庫允許您以非常非常類似於 POSIX 多執行緒的方式非常有效率地並行處理。您可以在所有phpthreads之間共用全域變量,在建立時將值/物件/數組傳遞給 PHPTHread,在執行的phpthreads之間輕鬆共用值/物件/數組,並在每個 PHPThread 透過phpthread_join()
終止時接收PHPThread 退出值/物件/陣列函數族。
我設計這個庫是因為我想編寫一個高效能的 WebSocket 伺服器來輕鬆處理數千個同時連接,透過這些連接可以快速傳輸大量資料(想想圖像或影片)。是的,從根本上來說,它是一個fork()
伺服器,但是頂部的 PHPThread 層使其超級易於部署,同時提供了一種簡單(和線程式)IPC 的機制。我本可以使用 C 語言並獲得更好的性能,但對我來說,隨著伺服器的啟動,這似乎更便攜且易於部署,所以現在就是這樣。
對於技術人員來說,這個函式庫不會因為需要使用「ticks」而暫時受到阻礙。這就是它如此之快的部分原因。該庫在內部使用訊號(例如 SIGUSR1 和 SIGUSR2)來中斷執行並非常流暢地切換上下文。是的,我們佔用了 SIGUSR1 和 2,因此如果您的專案正在使用這些訊號,請考慮使用phpthread_send_message()
到指定的訊息處理函數(請參閱:examples/messages1.php 和 Examples/messages2.php)。它應該完全適合您的目的。
您可以在“examples”目錄中運行一些範例。您可以隨意放置一個 shebang 以便於執行,或者透過在它們前面加上php <filename>
前綴來運行它們。我還沒有全部完成,但我已經完成了很多。至少足以充分了解這些功能。
phpthreads需要以下 PHP 擴充:
<?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);