在 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