在 PHP 中实现多线程

在 php 中实现多线程一直是开发者们关注的话题。随着互联网应用的不断发展,对于处理大量并发请求的需求也越来越迫切。本文将介绍如何在 php 中实现多线程,探讨多线程的优势和适用场景,帮助开发者更好地应对复杂的并发需求。让我们一起来深入了解多线程在 php 中的应用吧!


php 中使用 Parallel 并行并发扩展实现多线程

使用 Parallel 并行并发扩展,我们可以在 PHP 中实现多线程。

该扩展提供了一个解释线程 parallel/Runtime。我们可以从 parallel/Runtime() 类创建一个对象,从而创建一个线程。

该类提供了一个方法 run(),它安排任务并行运行。我们可以将 Closure 作为参数传递给 run 方法。

该参数一般称为 task,我们也可以指定一个数组作为方法的第二个参数。数组的内容被传递给任务。

在下载 Parallel 并行并发扩展之前有一些要求。PHP 版本应该是 8.0,并且应该启用 Zend Thread Safe (ZTS)。

标头是另一个要求。我们可以从 pecl 下载扩展程序,如下所示。

<code>
<code class="language-php hljs" data-lang="php"><span style="display:flex;"><span>pecl install parallel
</span></span></code></code>
登录后复制

我们可以使用 for 循环来测试程序的并行执行。

例如,我们可以在 run() 方法内运行一个循环,并在该方法外运行另一个循环。在这种情况下,代码执行将是并行的。

例如,创建 parallel/Runtime 类的对象 $rt,然后使用该对象调用 run() 方法。在 run() 方法中,编写一个匿名函数。

首先,编写一个 for 循环以在函数内打印 + 符号 50 次。接下来,在 run() 方法之外,编写另一个 for 循环来打印 - 符号 50 次。

由于 run() 方法内的循环在单独的线程中运行,run() 方法外的循环将同时执行。结果,-+ 符号同时打印,如下面的输出部分所示。

因此,我们可以使用并行并发扩展来实现 PHP 中的多线程。

示例代码:

<code>
<code class="language-php hljs" data-lang="php"><span style="display:flex;"><span><span style="color:#19177c">$rt</span> <span style="color:#666">=</span> <span style="color:#008000;font-weight:bold">new</span> /parallel/Runtime();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#19177c">$rt</span><span style="color:#666">-&gt;</span><span style="color:#7d9029">run</span>(<span style="color:#008000;font-weight:bold">funct<strong class="keylink">io</strong>n</span>(){
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$i</span> <span style="color:#666">=</span> <span style="color:#666">0</span>; <span style="color:#19177c">$i</span> <span style="color:#666"> <span style="color:#666">50</span>; <span style="color:#19177c">$i</span><span style="color:#666">++</span>)
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">echo</span> <span style="color:#ba2121">"+"</span>;
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$i</span> <span style="color:#666">=</span> <span style="color:#666">0</span>; <span style="color:#19177c">$i</span> <span style="color:#666"> <span style="color:#666">50</span>; <span style="color:#19177c">$i</span><span style="color:#666">++</span>) {
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">echo</span> <span style="color:#ba2121">"-"</span>;
</span></span><span style="display:flex;"><span>}
</span></span></span></span></code></code>
登录后复制

输出:

<code>
<code class="language-text hljs" data-lang="text"><span style="display:flex;"><span>-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</span></span></code></code>
登录后复制

在 PHP 中使用 popen() 函数实现多线程

我们可以使用 popen() 函数在 PHP 中打开并行进程。

该函数对进程进行分叉,从而实现并行处理。进程不共享资源。

这样,我们就可以在 PHP 中实现多线程了。popen() 函数创建一个到分叉进程的管道。

我们可以遍历 popen() 函数并创建多个进程来实现多线程。popen() 函数将 command 作为第一个参数,将 mode 作为第二个参数。

模式可以是 rw

例如,创建一个循环五次的 for 循环。在循环内部,创建另一个循环五次的 for 循环。

在子循环内,创建一个数组 $process 来存储 popen() 函数。将 PHP 文件 message.phpr 模式设置为第一个和第二个参数。

接下来,创建另一个子循环并使用 pclose() 函数关闭 $process

在这里,五个进程在第一个子循环中并行执行。进程在第二个子循环中用 pclose() 函数终止。

这就是我们如何使用 PHP 中的 popen() 函数来实现多线程。

示例代码:

<code>
<code class="language-php hljs" data-lang="php"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$i</span><span style="color:#666">=</span><span style="color:#666">0</span>; <span style="color:#19177c">$i</span><span style="color:#666"><span style="color:#666">5</span>; <span style="color:#19177c">$i</span><span style="color:#666">++</span>) {
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$j</span><span style="color:#666">=</span><span style="color:#666">0</span>; <span style="color:#19177c">$j</span><span style="color:#666"><span style="color:#666">5</span>; <span style="color:#19177c">$j</span><span style="color:#666">++</span>) {
</span></span><span style="display:flex;"><span> <span style="color:#19177c">$process</span>[<span style="color:#19177c">$j</span>] <span style="color:#666">=</span> popen(<span style="color:#ba2121">'message.php'</span>, <span style="color:#ba2121">'r'</span>);
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">for</span> (<span style="color:#19177c">$j</span><span style="color:#666">=</span><span style="color:#666">0</span>; <span style="color:#19177c">$j</span><span style="color:#666"><span style="color:#666">5</span>; <span style="color:#666">++</span><span style="color:#19177c">$j</span>) {
</span></span><span style="display:flex;"><span> pclose(<span style="color:#19177c">$process</span>[<span style="color:#19177c">$j</span>]);
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>}
</span></span></span></span></span></code></code>
登录后复制

以上就是在 PHP 中实现多线程的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/692157.html

发表回复

Your email address will not be published. Required fields are marked *