在PHP无法实现多线程的原因是什么

  介绍

这期内容当中小编将会给大家带来有关在PHP无法实现多线程的原因是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

有没有办法在PHP中实现多线程呢?假设你正在写一个基于多台服务器的PHP应用,理想的情况时同时向多台服务器发送请求,而不是一台接一台。可以实现吗?当有人想要实现并发功能时,他们通常会想到用叉或者派生线程,但是当他们发现PHP不支持多线程的时候,大概会转换思路去用一些不够好的语言,比如Perl。
假设你要建立一个服务来检查正在运行的n台服务器,以确定他们还在正常运转。你可能会写下面这样的代码:

hosts 美元;=,数组(“host1.sample.com",,“host2.sample.com",,“host3.sample.com"),,   15 $ timeout =,,,   数组$ status =, ();,   foreach  (hosts 美元;as  $主机),{,,   ,,,errno 美元;=,0;,,   errstr 美元,,,,,,,,,,,   ,,,s 美元;=,fsockopen(主机,美元,80年,errno美元,errstr美元,美元超时),,,   ,,,if  (s), {,,   ,,,,,,美元地位(美元主机),=,“Connectedn",,,   ,,,,,,写入文件(年代,美元,“HEAD /, HTTP/1.0 rnhost:, hostrnrn"美元;);,,   ,,,,,do  {,,   ,,,,,,,data 美元;=,从文件中读($ s, 8192,),,,,   ,,,,,,,if  (strlen(元数据),==,0),{,,   ,,,,,,,休息,,,,   ,,,,,,,},,,   ,,,,,,美元地位(美元主机),,=,元数据;,,   ,,,,},,   ,,,,while (真正的),,,   ,,,,,文件关闭($ s);,,   ,,,,},,   ,,,,else  {,,   ,,,,,,美元地位(美元主机),=,“Connection 失败:,errno 美元;errstrn"美元;,,,   ,,,,},   },   print_r()美元地位),,   祝辞;

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

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

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

hosts 美元;=,数组(“host1.sample.com",,“host2.sample.com",,“host3.sample.com"),,   15 $ timeout =,,,   数组$ status =, ();,   数组$ sockets =, ();,/*,Initiate  connections 用all 从而hosts  simultaneously  */,   foreach  (hosts 美元;as  id 美元;=祝辞,美元主机),{,,   ,,,s 美元;=,stream_socket_client(“主持人:美元80,,,errno美元,errstr美元,美元超时,,,   ,,,,,,STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT);,,   ,,,if  (s), {,,   ,,,,,套接字美元($ id],=,年代美元;,,   ,,,,,美元地位($ id],=,“拷贝progress",,,   ,,,},,   ,,,else {,美元地位($ id]=,“失败了,,errno 美元;errstr"美元;,,,   ,,,},   },/*,现在,wait  for 从而results 用come  back 拷贝*/,   ,   while  (count($套接字)),{,,   ,,read 美元;=,write 美元;=,套接字美元;,,/*,却;能够is 从而magic  function 作用;explained  below  */,,   n 美元,,,=,stream_select($读,写,美元,美元e =, null,,美元超时),,,   ,,if  (n 美元;祝辞,0),{,,   ,,/*,readable  sockets  either  have  data  for 我们,或是断开连接;failed , *, connection  attempts  */,,   ,,,,foreach  (read 美元;as  $ r), {,,,   ,,,,,,,,,id 美元;=,函数(r美元,,套接字),,,,,   ,,,,,,,,,data 美元;=,从文件中读($ r, 8192,),,,,,   ,,,,if  (strlen(元数据),==,0),{,,   ,,,,,,,,,if (美元地位($ id],==,“拷贝progress"), {,,   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

在PHP无法实现多线程的原因是什么