在 PHP 中實現多執行緒

Jinku Hu 2023年1月30日
  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]);
 }
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook