代码PHP多线程的实现方法详解

php多线程  时间:2021-01-31  阅读:()

PHP多线程的实现方法详解多线程是java中一个很不错的东西很多朋友说在php中不可以使用PHP多线程了其实那是错误的说法PHP多线程实现方法和fsockopen函数有关下面我们来介绍具体实现程序代码有需要了解的同学可参考。

当有人想要实现并发功能时他们通常会想到用fork或者spawnthreads但是当他们发现php不支持多线程的时候大概会转换思路去用一些不够好的语言 比如perl。

其实的是大多数情况下你大可不必使用fork或者线程并且你会得到比用fork或thread更好的性能。

假设你要建立一个服务来检查正在运行的n台服务器以确定他们还在正常运转。你可能会写下面这样的代码

代码如下 复制代码<?php

$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);

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

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

有两种方法可以实现PHP5中可以使用新增的stream_socket_cl ient()函数直接替换掉fsocketopen()。 PHP5之前的版本你需要自己动手

用sockets扩展解决问题。

下面是PHP5中的解决方法

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

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

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

下面是PHP5中的解决方法

代码如下 复制代码<?php

$hosts=array("host1 .sample.com", "host2.sample.com",

"host3.sample.com");

$timeout=15;

$status=array();

$sockets=array();

/* Initiate connections to al l the hosts simultaneously*/foreach($hosts as$id=>$host) {

$s=stream_socket_cl ient("

$

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

下面是PHP4.1 .0之后版本的实现如果你已经在编译PHP时包含了

sockets(ext/sockets)支持你可以使用根上面类似的代码只是需要将上面的streams/fi lesystem函数的功能用ext/sockets函数实现。主要的不同在于我们用下面的函数代替stream_socket_cl ient()来建立连接代码如下 复制代码

现在用socket_select()替换掉stream_select()用socket_read()替换掉fread()用socket_write()替换掉fwrite()用socket_close()替换掉fc l o s e()就可以执行脚本了

PHP5的先进之处在于你可以用stream_select()处理几乎所有的

stream-例如你可以通过includeSTDIN用它接收键盘输入并保存进数

组你还可以接收通过proc_open()打开的管道中的数据。

下面来分享一个PHP多线程类

代码如下 复制代码

{

$out="GET{$_SERVER['PHP_SELF']}?flag=$i HTTP/1 .1rn";$out .="Host: {$_SERVER['HTT P_HOST']}rn";

$out .="Connection:Closernrn";fputs($fp,$out);fcl os e($fp);

}

}

}

}

}

美国云服务器 1核 1G 100M 10G防御 39元/月 物语云计算

物语云计算(MonogatariCloud)是一家成立于2016年的老牌国人商家,主营国内游戏高防独服业务,拥有多家机房资源,产品质量过硬,颇有一定口碑。本次带来的是美国圣何塞 Equinix 机房的高性能I9-10980XE大带宽VPS,去程CN2GIA回程AS9929,美国原生IP,支持解锁奈飞等应用,支持免费安装Windows系统。值得注意的是,物语云采用的虚拟化技术为Hyper-V,资源全...

搬瓦工VPS:新增荷兰机房“联通”线路的VPS,10Gbps带宽,可在美国cn2gia、日本软银、荷兰“联通”之间随意切换

搬瓦工今天正式对外开卖荷兰阿姆斯特丹机房走联通AS9929高端线路的VPS,官方标注为“NL - China Unicom Amsterdam(ENUL_9)”,三网都走联通高端网络,即使是在欧洲,国内访问也就是飞快。搬瓦工的依旧是10Gbps带宽,可以在美国cn2 gia、日本软银与荷兰AS9929之间免费切换。官方网站:https://bwh81.net优惠码:BWH3HYATVBJW,节约6...

美国G口/香港CTG/美国T级超防云/物理机/CDN大促销 1核 1G 24元/月

[六一云迎国庆]转盘活动实物礼品美国G口/香港CTG/美国T级超防云/物理机/CDN大促销六一云 成立于2018年,归属于西安六一网络科技有限公司,是一家国内正规持有IDC ISP CDN IRCS电信经营许可证书的老牌商家。大陆持证公司受大陆各部门监管不好用支持退款退现,再也不怕被割韭菜了!主要业务有:国内高防云,美国高防云,美国cera大带宽,香港CTG,香港沙田CN2,海外站群服务,物理机,...

php多线程为你推荐
天玑1000plus和骁龙865哪个好各位觉得联发科最新芯片天机1000靠谱吗?真的能打过麒麟990?聚酯纤维和棉哪个好聚酯纤维和纯棉的相比,哪个好?莫代尔和纯棉哪个好莫代尔和纯棉内裤哪个好?游戏加速器哪个好网游加速器哪个最好用?音乐播放器哪个好最好的音乐播放器是什么三国游戏哪个好玩三国类单机游戏哪个最好玩啊?等额本息等额本金哪个好到底是等额本息好还是等额本金好?dnf魔枪士转职哪个好dnf平民魔枪士转什么好播放器哪个好什么播放器好用电动牙刷哪个好电动牙刷哪个牌子好?准备就买个几百块钱的?
域名主机管理系统 域名备案网站 香港bgp机房 百度云100as mediafire cpanel idc评测网 360抢票助手 青果网 腾讯云分析 asp免费空间申请 域名接入 网络空间租赁 idc查询 支持外链的相册 银盘服务 最漂亮的qq空间 台湾google 空间登陆首页 监控服务器 更多