在 PHP 中實現多執行緒

Jinku Hu 2023年1月30日 2022年5月13日
  1. 在 PHP 中使用 Parallel 並行併發擴充套件實現多執行緒
  2. 在 PHP 中使用 popen() 函式實現多執行緒
在 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 作為第二個引數。

模式可以是 rw

例如,建立一個迴圈五次的 for 迴圈。在迴圈內部,建立另一個迴圈五次的 for 迴圈。

在子迴圈內,建立一個陣列 $process 來儲存 popen() 函式。將 PHP 檔案 message.phpr 模式設定為第一個和第二個引數。

接下來,建立另一個子迴圈並使用 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]);
 }
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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