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);
}
}
}
}
}
zji怎么样?zji是一家老牌国人主机商家,公司开办在香港,这个平台主要销售独立服务器业务,和hostkvm是同一样,两个平台销售的产品类别不一平,商家的技术非常不错,机器非常稳定。昨天收到商家的优惠推送,目前针对香港邦联四型推出了65折优惠BGP线路服务器,性价比非常不错,有需要香港独立服务器的朋友可以入手,非常适合做站。zji优惠码:月付/年付优惠码:zji 物理服务器/VDS/虚拟主机空间订...
Sharktech最近洛杉矶和丹佛低价配置大部分都无货了,只有荷兰机房还有少量库存,商家又提供了两款洛杉矶特价独立服务器,价格不错,CPU/内存/硬盘都是高配,1-10Gbps带宽不限流量最低129美元/月起。鲨鱼机房(Sharktech)我们也叫它SK机房,是一家成立于2003年的老牌国外主机商,提供的产品包括独立服务器租用、VPS主机等,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹等,主...
HostKvm是一家成立于2013年的国外VPS服务商,产品基于KVM架构,数据中心包括日本、新加坡、韩国、美国、俄罗斯、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。本月,商家旗下俄罗斯、新加坡、美国、香港等节点带宽进行了大幅度升级,俄罗斯机房国内电信/联通直连,CN2线路,150Mbps(原来30Mbps)带宽起,目前俄罗斯和香港高防节点5折骨折码继续优惠中...