在 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