广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何解决PHP无法实现多线程的问题
  • 607
分享到

如何解决PHP无法实现多线程的问题

2023-06-17 14:06:46 607人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“如何解决PHP无法实现多线程的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决php无法实现多线程的问题”这篇文章吧。其实的是大多数情况下,你大可不必使用fo

这篇文章主要为大家展示了“如何解决PHP无法实现多线程的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决php无法实现多线程的问题”这篇文章吧。

其实的是大多数情况下,你大可不必使用fork或者线程,并且你会得到比用fork或thread更好的性能。假设你要建立一个服务来检查正在运行的n台服务器,以确定他们还在正常运转。你可能会写下面这样的代码:

$hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com");  $timeout = 15;  $status = array();  foreach ($hosts as $host) {           $errno = 0;           $errstr = "";           $s = fsockopen($host, 80, $errno, $errstr, $timeout);           if ($s) {                 $status[$host] = "Connectedn";                 fwrite($s, "HEAD / Http/1.0rnHost: $hostrnrn");                do {                     $data = fread($s, 8192);                     if (strlen($data) == 0) {                     break;                     }                  $status[$host] .= $data;             }            while (true);                fclose($s);             }            else {                  $status[$host] = "Connection failed: $errno $errstrn";            }  }  print_r($status);  ?>

它运行的很好,但是在fsockopen()分析完hostname并且建立一个成功的连接(或者延时$timeout秒)之前,扩充这段代码来管理大量服务器将耗费很长时间。

因此我们必须放弃这段代码;我们可以建立异步连接-不需要等待fsockopen返回连接状态。PHP仍然需要解析hostname(所以直接使用ip更加明智),不过将在打开一个连接之后立刻返回,继而我们就可以连接下一台服务器。

有两种方法可以实现;PHP5中可以使用新增的stream_Socket_client()函数直接替换掉fsocketopen()。PHP5之前的版本,你需要自己动手,用sockets扩展解决问题。下面是PHP5中的解决方法:

$hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com");  $timeout = 15;  $status = array();  $sockets = array();    foreach ($hosts as $id => $host) {           $s = stream_socket_client("$host:80", $errno, $errstr, $timeout,                 STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);           if ($s) {                $sockets[$id] = $s;                $status[$id] = "in progress";           }           else {  $status[$id] = "failed, $errno $errstr";           }  }     while (count($sockets)) {         $read = $write = $sockets;            $n = stream_select($read, $write, $e = null, $timeout);         if ($n > 0) {                        foreach ($read as $r) {                           $id = array_search($r, $sockets);                           $data = fread($r, 8192);                  if (strlen($data) == 0) {                        if ($status[$id] == "in progress") {                             $status[$id] = "failed to connect";                        }               fclose($r);               unset($sockets[$id]);                   }              else {                      $status[$id] .= $data;                   }            }        foreach ($write as $w) {              $id = array_search($w, $sockets);              fwrite($w, "HEAD / HTTP/1.0rnHost: "               . $hosts[$id] .  "rnrn");              $status[$id] = "waiting for response";             }   }   else {        foreach ($sockets as $id => $s) {              $status[$id] = "timed out "            . $status[$id];             }    break;     }  }  foreach ($hosts as $id => $host) {         echo "Host: $hostn"; echo "Status: "         . $status[$id] . "nn";  }   ?>

我们用stream_select()等待sockets打开的连接事件。stream_select()调用系统的select(2)函数来工 作:前面三个参数是你要使用的streams的数组;你可以对其读取,写入和获取异常(分别针对三个参数)。stream_select()可以通过设 置$timeout(秒)参数来等待事件发生-事件发生时,相应的sockets数据将写入你传入的参数。

下面是PHP4.1.0之后版本的实现,如果你已经在编译PHP时包含了sockets(ext/sockets)支持,你可以使用根上面类似的代 码,只是需要将上面的streams/filesystem函数的功能用ext/sockets函数实现。主要的不同在于我们用下面的函数代替 stream_socket_client()来建立连接:

// This value is correct for linux, other systems have other values  define('EINPROGRESS', 115);  function non_blocking_connect($host, $port, &$errno, &$errstr, $timeout) {           $ip = gethostbyname($host);           $s = socket_create(AF_INET, SOCK_STREAM, 0);           if (socket_set_nonblock($s)) {               $r = @socket_connect($s, $ip, $port);               if ($r || socket_last_error() == EINPROGRESS) {                       $errno = EINPROGRESS;                       return $s;                   }            }           $errno = socket_last_error($s);           $errstr = socket_strerror($errno);           socket_close($s);           return false;  }  ?>

现在用socket_select()替换掉stream_select(),用socket_read()替换掉fread(),用socket_write()替换掉fwrite(),用socket_close()替换掉fclose()就可以执行脚本了!
PHP5的先进之处在于,你可以用stream_select()处理几乎所有的stream。例如你可以通过include STDIN用它接收键盘输入并保存进数组,你还可以接收通过proc_open()打开的管道中的数据。

以上是“如何解决PHP无法实现多线程的问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: 如何解决PHP无法实现多线程的问题

本文链接: https://www.lsjlt.com/news/289639.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决PHP无法实现多线程的问题
    这篇文章主要为大家展示了“如何解决PHP无法实现多线程的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决PHP无法实现多线程的问题”这篇文章吧。其实的是大多数情况下,你大可不必使用fo...
    99+
    2023-06-17
  • Junit测试多线程无法得到结果的问题解决
    目录猜测可能原因问题排查问题原因总结 class Main { public static void main(String[] args) { Strin...
    99+
    2022-11-12
  • php无法链接mssql问题如何解决
    这篇文章主要介绍“php无法链接mssql问题如何解决”,在日常操作中,相信很多人在php无法链接mssql问题如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php无法链接mssql问题如何解决”的疑...
    99+
    2023-06-20
  • java多线程并发问题如何解决
    在Java中,可以使用以下方法来解决多线程并发问题:1. 使用synchronized关键字:可以通过在方法或代码块前加上synch...
    99+
    2023-09-27
    java
  • 如何解决Java多线程死锁问题
    死锁问题 死锁定义 多线程编程中,因为抢占资源造成了线程无限等待的情况,此情况称为死锁。 死锁举例 注意:线程和锁的关系是:一个线程可以拥有多把锁,一个锁只能被一个线程拥有。 当两个...
    99+
    2022-11-12
  • php无法访问此网站的问题如何解决
    这篇文章主要讲解了“php无法访问此网站的问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php无法访问此网站的问题如何解决”吧!php无法访问此网站的解决办法:1、初始化空间或重...
    99+
    2023-06-20
  • php如何解决进程太多的问题
    小编给大家分享一下php如何解决进程太多的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php进程太多的解决办法:1、通过“ps -ef  | wc...
    99+
    2023-06-25
  • 如何解决ubuntu apache2无法打开php问题
    这篇文章将为大家详细讲解有关如何解决ubuntu apache2无法打开php问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ubuntu apache2无法打开php的解决办法:1、打开配置文件htt...
    99+
    2023-06-22
  • ubuntu中如何解决php无法编译问题
    小编给大家分享一下ubuntu中如何解决php无法编译问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ubuntu的php无法编译的解决办法:1、执行“apt-...
    99+
    2023-06-22
  • SpringBoot+Spring Security无法实现跨域的问题如何解决
    本篇内容主要讲解“SpringBoot+Spring Security无法实现跨域的问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot+Spring Security...
    99+
    2023-06-20
  • C++多线程编程之如何解决多线程数据共享问题
    这篇文章主要讲解了“C++多线程编程之如何解决多线程数据共享问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++多线程编程之如何解决多线程数据共享问题”吧!通过容器创建多个线程#incl...
    99+
    2023-06-15
  • C++中的多线程同步问题及解决方法
    C++中的多线程同步问题及解决方法多线程编程是提高程序性能和效率的一种方式,但同时也带来了一系列的同步问题。在多线程编程中,多个线程可能会同时访问和修改共享的数据资源,这可能导致数据的竞争条件、死锁、饥饿等问题。为了避免这些问题,我们需要使...
    99+
    2023-10-22
    多线程 (Multithreading) 同步 (synchronization) 解决方法 (Solution)
  • 如何解决无法远程连接mysql的问题
    这篇文章给大家分享的是有关如何解决无法远程连接mysql的问题的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。无法远程连接mysql的解决方法:1、登录mysql;2、执行【gra...
    99+
    2022-10-18
  • 如何解决linux无法重启php服务的问题
    这篇文章给大家分享的是有关如何解决linux无法重启php服务的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。linux无法重启php服务的解决办法:1、通过“/etc/init.d/php-fpm stop...
    99+
    2023-06-22
  • 多线程如何解决for循环效率的问题
    多线程解决for循环效率问题 在for里面,如果执行一次for里面的内容所需时间比较长,可以使用线程池来提高for循环的效率 public class TreadFor { pr...
    99+
    2022-11-12
  • 如何解决php无法计算浮点数问题
    这篇文章主要介绍如何解决php无法计算浮点数问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php无法计算浮点数是因为计算机底层二进制无法精确表示浮点数,其解决办法就是使用精准计算的类库或函数库,如使用php中的B...
    99+
    2023-06-25
  • ubuntu出现有线已连接却无法上网的问题如何解决
    本篇内容主要讲解“ubuntu出现有线已连接却无法上网的问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ubuntu出现有线已连接却无法上网的问题如何解决”吧!ubuntu出现有线已连...
    99+
    2023-06-13
  • java全局变量多线程问题如何解决
    在Java中,可以使用以下几种方式来解决全局变量多线程问题:1. 使用synchronized关键字:在访问全局变量时,使用sync...
    99+
    2023-08-26
    java
  • 多线程编程中遇到的Python问题及解决方法
    多线程编程中遇到的Python问题及解决方法Python是一种广泛使用的编程语言,它有许多优点,其中之一就是可以通过多线程来提高程序的执行效率。然而,在多线程编程中,也会遇到一些常见的问题。本文将讨论一些常见的多线程编程问题,并提供相应的解...
    99+
    2023-10-22
    死锁(Deadlock):多线程编程中
  • 如何解决mysql无法关闭的问题
    mysql关闭不了的解决办法: 右键点击电脑的任务栏,打开任务管理器 点击服务,找到mysql服务 右键点击该服务,选择停止就可以了 内容扩展: mac系统mysqld进程无法kill掉的问题 mac安装比li...
    99+
    2022-05-16
    mysql 无法关闭
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作