在 PHP 中實作多執行緒一直是開發者關注的話題。隨著網路應用的不斷發展,對於處理大量並發請求的需求也越來越迫切。本文將介紹如何在 PHP 中實現多線程,探討多線程的優勢和適用場景,幫助開發者更好地應對複雜的並發需求。讓我們一起來深入了解多線程在 PHP 中的應用吧!
Parallel
並行並發擴充實作多執行緒
使用 Parallel
並行並發擴展,我們可以在 PHP 中實作多執行緒。
該擴充功能提供了一個解釋線程 parallel\Runtime
。我們可以從 parallel\Runtime()
類別建立一個對象,從而建立一個執行緒。
類別提供了一個方法 run()
,它安排任務並行運行。我們可以將 Closure
作為參數傳遞給 run
方法。
這個參數一般稱為 task
,我們也可以指定一個陣列作為方法的第二個參數。數組的內容傳遞給任務。
在下載 Parallel
並行並發擴充功能之前有一些要求。 PHP 版本應該是 8.0,並且應該啟用 Zend Thread Safe (ZTS)。
<pthread.h>
標頭是另一個要求。我們可以從 pecl
下載擴充程序,如下所示。
<code> <code class="language-php hljs" data-lang="php"><span style="display:flex;"><span>pecl install parallel </span></span></code></code>
我們可以使用 for
迴圈來測試程式的平行執行。
例如,我們可以在 run()
方法內執行一個循環,並在該方法外執行另一個循環。在這種情況下,程式碼執行將是並行的。
例如,建立 parallel\Runtime
類別的物件 $rt
,然後使用該物件呼叫 run()
方法。在 run()
方法中,寫一個匿名函數。
首先,寫一個 for
迴圈以在函數內列印
符號 50 次。接下來,在 run()
方法之外,再寫一個 for
迴圈來列印 -
符號 50 次。
由於 run()
方法內的迴圈在單獨的執行緒中運行,run()
方法外的迴圈將同時執行。結果,-
和
符號同時列印,如下面的輸出部分所示。
因此,我們可以使用並行並發擴充功能來實作 PHP 中的多執行緒。
範例程式碼:
<code> <code class="language-php hljs" data-lang="php"><span style="display:flex;"><span><span style="color:#19177c">$rt</span> <span style="color:#666">=</span> <span style="color:#008000;font-weight:bold">new</span> \parallel\Runtime(); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#19177c">$rt</span><span style="color:#666">-></span><span style="color:#7d9029">run</span>(<span style="color:#008000;font-weight:bold">funct<strong class="keylink">io</strong>n</span>(){ </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$i</span> <span style="color:#666">=</span> <span style="color:#666">0</span>; <span style="color:#19177c">$i</span> <span style="color:#666"><</span> <span style="color:#666">50</span>; <span style="color:#19177c">$i</span><span style="color:#666">++</span>) </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">echo</span> <span style="color:#ba2121">"+"</span>; </span></span><span style="display:flex;"><span>}); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$i</span> <span style="color:#666">=</span> <span style="color:#666">0</span>; <span style="color:#19177c">$i</span> <span style="color:#666"><</span> <span style="color:#666">50</span>; <span style="color:#19177c">$i</span><span style="color:#666">++</span>) { </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">echo</span> <span style="color:#ba2121">"-"</span>; </span></span><span style="display:flex;"><span>} </span></span></code></code>
輸出:
<code> <code class="language-text hljs" data-lang="text"><span style="display:flex;"><span>-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </span></span></code></code>
popen()
函數實作多執行緒
我們可以使用 popen()
函數在 PHP 中開啟平行進程。
此函數對進程進行分叉,從而實現並行處理。進程不共享資源。
這樣,我們就可以在 PHP 中實作多執行緒了。 popen()
函數建立一個到分叉進程的管道。
我們可以遍歷 popen()
函數並建立多個進程來實作多執行緒。 popen()
函數將 command
作為第一個參數,將 mode
作為第二個參數。
模式可以是 r
或 w
。
例如,建立一個循環五次的 for
迴圈。在迴圈內部,建立另一個迴圈五次的 for
迴圈。
在子迴圈內,建立一個陣列 $process
來儲存 popen()
函數。將 PHP 檔案 message.php
和 r
模式設定為第一個和第二個參數。
接下來,建立另一個子循環並使用 pclose()
函數關閉 $process
。
在這裡,五個進程在第一個子循環中並行執行。進程在第二個子循環中以 pclose()
函數終止。
這就是我們如何使用 PHP 中的 popen()
函數來實作多執行緒。
範例程式碼:
<code> <code class="language-php hljs" data-lang="php"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$i</span><span style="color:#666">=</span><span style="color:#666">0</span>; <span style="color:#19177c">$i</span><span style="color:#666"><</span><span style="color:#666">5</span>; <span style="color:#19177c">$i</span><span style="color:#666">++</span>) { </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$j</span><span style="color:#666">=</span><span style="color:#666">0</span>; <span style="color:#19177c">$j</span><span style="color:#666"><</span><span style="color:#666">5</span>; <span style="color:#19177c">$j</span><span style="color:#666">++</span>) { </span></span><span style="display:flex;"><span> <span style="color:#19177c">$process</span>[<span style="color:#19177c">$j</span>] <span style="color:#666">=</span> popen(<span style="color:#ba2121">'message.php'</span>, <span style="color:#ba2121">'r'</span>); </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$j</span><span style="color:#666">=</span><span style="color:#666">0</span>; <span style="color:#19177c">$j</span><span style="color:#666"><</span><span style="color:#666">5</span>; <span style="color:#666">++</span><span style="color:#19177c">$j</span>) { </span></span><span style="display:flex;"><span> pclose(<span style="color:#19177c">$process</span>[<span style="color:#19177c">$j</span>]); </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} </span></span></code></code>
以上是在 PHP 中實作多線程的詳細內容。更多資訊請關注PHP中文網其他相關文章!