专业游戏门户,分享手游网游单机游戏百科知识攻略!

嗨游网
嗨游网

php多线程怎么实现,php多线程实现方法

来源:小嗨整编  作者:小嗨  发布时间:2023-02-20 06:25
摘要:php多线程怎么实现,php多线程实现方法。别的语言都在一窝蜂地搞编译,搞虚拟机,搞多线程,提高效率。我们整天敲PHP代码,除了Nginx调用php-fpm拉取PHP文件的解析外,对于多线程有多少了解?请问,PHP能不能使用多线程?如果能,...

php多线程怎么实现,php多线程实现方法。别的语言都在一窝蜂地搞编译,搞虚拟机,搞多线程,提高效率。我们整天敲 PHP 代码,除了 Nginx 调用 php-fpm 拉取 PHP 文件的解析外,对于多线程有多少了解?

php多线程怎么实现,php多线程实现方法

请问,PHP 能不能使用多线程?如果能,怎么实现的?

本文就带你打开这个疑问。

这个问题的答案是肯定的,PHP 可以使用多线程。我们借助于 pthreads 实现:

该项目提供了与基于Posix Threads的PHP兼容的多线程。

有啥亮点没?下面这些全是:

  • 一个易于使用,快速学习的面向对象的PHP 7.2线程API

  • 执行所有预定义和用户声明的方法和函数,包括闭包。

  • 包括现成的同步

  • 无限的可能性...

需要一些扩展的基础的支持,PHP 7.2 及以上版本,ZTS Enabled ( Thread Safety ),Posix Threads Implementation。

还有一些注意事项:

pthreads是一个面向对象的API,它提供了PHP中多线程所需的所有工具。PHP应用程序可以创建,读取,写入,执行并与线程,辅助对象和线程对象同步。

警告:pthreads扩展名不能在Web服务器环境中使用。因此,PHP中的线程应仅保留给基于CLI的应用程序使用。

命令行应用脚本完全适用,这也与我们编写 Bash,Python等等类似。下面举一个例子:

php多线程怎么实现,php多线程实现方法

然后执行一次:

php多线程怎么实现,php多线程实现方法

再执行一次:

php多线程怎么实现,php多线程实现方法

上面的代码是个示例性质的应用,仅仅是为了展示多线程运行。下面来一段业务代码。

php多线程怎么实现,php多线程实现方法

该类模拟一个url请求。因为网络问题,有可能失败,或者不确定返回时间,所以适合并行。接着我们使用该类进行多网络请求并发。为了减轻系统负荷,使用微秒延时。

$t = microtime(true);
$g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10));

实例化之后,我们发起请求:

if ($g->start()) {
   printf("Request took %f seconds to start ", microtime(true) - $t);
   while ( $g->isRunning() ) {
       echo ".";
       usleep(100);
   }
   if ($g->join()) {
       printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data));
   } else
       printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);
}

如果不用 pthreads 库提供的能力,该怎么写并行的多任务呢?其实 PHP 提供了一个 popen 函数,用于打开进程文件指针。

popen 返回一个和 fopen 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用  pclose 来关闭。此指针可以用于 fgets,fgetss 和  fwrite。  当模式为 'r',返回的文件指针等于命令的 STDOUT,当模式为 'w',返回的文件指针等于命令的 STDIN。

直接上代码:

for ($i=0; $i<10; $i++) {
   // 打开10个进程
   for ($j=0; $j<10; $j++) {
       $pipe[$j] = popen('script2.php', 'w');
   }
   // 等待完成
   for ($j=0; $j<10; ++$j) {
       pclose($pipe[$j]);
   }
}

大家看到了实现的方法与 pthreads 完全不同,这段代码仍然是阻塞运行,只不过同时打开10个进程,并行运行。

并行与多线程完全不同。不过,可视作一个简单的解决方案吧。

经过上述两种实现方法,大家应该对于多线程,多进程,并行这些概念有一些认识了。



本文地址:软件教程频道 https://www.eeeoo.cn/ruanjian/903148.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!


软件教程
小编:小嗨整编
相关文章相关阅读
  • PHP调用美联软通短信接口实现短信发送

    PHP调用美联软通短信接口实现短信发送

    随着人们生活水平的提高和科技的发展,短信已成为人们交流的主要方式之一,越来越多的企业开始通过短信平台来实现营销、提醒等功能。在这个过程中,短信接口的选择显得尤为重要。本文将介绍如何通过php调用美联软通短信接口实现短信发送。一、美联软通短信...

  • php怎么实现对字符串的排序

    php怎么实现对字符串的排序

    实现步骤:1、利用str_split()函数将字符串转为字符数组,语法“str_split(字符串)”;2、使用asort()或arsort()函数来对字符数组进行升序排序或降序排序,语法“asort(字符数组)”或“arsort(字符数组...

  • php文件gbk怎么转utf8

    php文件gbk怎么转utf8

    php文件gbk转utf8的方法:首先建立存放转换后文件的目录;然后建立对应的文件夹;最后通过“-execiconv-fgbk-tutf-8{}-outf8/...”方法转换php文件即可。本文操作环境:windows7系统...

  • 如何使用PHP中的字符串变量

    如何使用PHP中的字符串变量

    如何使用PHP中的字符串变量在PHP中,字符串变量是一种非常常见的数据类型,用于存储和操作文本数据。在本文中,我们将介绍如何使用PHP中的字符串变量,并提供一些具体的代码示例。字符串变量的声明和赋值在PHP中,要声明一个字符串变量,只需要使...

  • php中三元表达式怎么写

    php中三元表达式怎么写

    在php中,三元表达式可以实现简单的条件判断功能,写法为“表达式1?表达式2:表达式3”;如果条件“表达式1”成立,则执行语句“表达式2”,否则执行“表达式3”。本教程操作环境:windows7系统、PHP7.1版、DELLG3电脑php...

  • php错误哪几种

    php错误哪几种

    php错误一般分为三类:1、语法错误,是在编程中最容易碰到也是最容易解决的一种错误;2、运行时错误,是在程序执行时出现的错误;3、逻辑错误,程序会正常执行,只是输出的结果并不是我们期望的而已。本教程操作环境:windows7系统、PHP7....

  • php如何使用静态方法?

    php如何使用静态方法?

    php是一种开源的服务器端编程语言,广泛应用于网站开发、软件开发和数据处理等领域。它是一种动态的语言,支持面向对象编程(oop)。在php中,静态方法是一种非常重要的oop概念,它可以帮助我们更好地组织代码和提高程序的效率。本文将介绍PHP...

  • PHP百钱百鸡问题(三种解题思路及答案)

    PHP百钱百鸡问题(三种解题思路及答案)

    假设:如果公鸡1只,母鸡1只,小鸡1只,则总价为:......,不对。如果公鸡1只,母鸡1只,小鸡2只,则总价为:......,不对。如果公鸡1只,母鸡1只,小鸡3只,则总价为:......,不对。........................

  • 周排行
  • 月排行
  • 年排行

精彩推荐