在 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
下載擴充套件程式,如下所示。
pecl install parallel
我們可以使用 for
迴圈來測試程式的並行執行。
例如,我們可以在 run()
方法內執行一個迴圈,並在該方法外執行另一個迴圈。在這種情況下,程式碼執行將是並行的。
例如,建立 parallel\Runtime
類的物件 $rt
,然後使用該物件呼叫 run()
方法。在 run()
方法中,編寫一個匿名函式。
首先,編寫一個 for
迴圈以在函式內列印 +
符號 50 次。接下來,在 run()
方法之外,編寫另一個 for
迴圈來列印 -
符號 50 次。
由於 run()
方法內的迴圈在單獨的執行緒中執行,run()
方法外的迴圈將同時執行。結果,-
和 +
符號同時列印,如下面的輸出部分所示。
因此,我們可以使用並行併發擴充套件來實現 PHP 中的多執行緒。
示例程式碼:
$rt = new \parallel\Runtime();
$rt->run(function(){
for ($i = 0; $i < 50; $i++)
echo "+";
});
for ($i = 0; $i < 50; $i++) {
echo "-";
}
輸出:
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在 PHP 中使用 popen()
函式實現多執行緒
我們可以使用 popen()
函式在 PHP 中開啟並行程序。
該函式對程序進行分叉,從而實現並行處理。程序不共享資源。
這樣,我們就可以在 PHP 中實現多執行緒了。popen()
函式建立一個到分叉程序的管道。
我們可以遍歷 popen()
函式並建立多個程序來實現多執行緒。popen()
函式將 command
作為第一個引數,將 mode
作為第二個引數。
模式可以是 r
或 w
。
例如,建立一個迴圈五次的 for
迴圈。在迴圈內部,建立另一個迴圈五次的 for
迴圈。
在子迴圈內,建立一個陣列 $process
來儲存 popen()
函式。將 PHP 檔案 message.php
和 r
模式設定為第一個和第二個引數。
接下來,建立另一個子迴圈並使用 pclose()
函式關閉 $process
。
在這裡,五個程序在第一個子迴圈中並行執行。程序在第二個子迴圈中用 pclose()
函式終止。
這就是我們如何使用 PHP 中的 popen()
函式來實現多執行緒。
示例程式碼:
for ($i=0; $i<5; $i++) {
for ($j=0; $j<5; $j++) {
$process[$j] = popen('message.php', 'r');
}
for ($j=0; $j<5; ++$j) {
pclose($process[$j]);
}
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn