• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

巧妙解决PHP无法实现多线程的问题_PHP

php 搞代码 3年前 (2022-01-25) 21次浏览 已收录 0个评论

有没有办法在PHP中实现多线程呢?假设你正在写一个基于多台服务器的PHP应用,理想的情况时同时向多台服务器发送请求,而不是一台接一台。可以实现吗?当有人想要实现并发功能时,他们通常会想到用fork或者spawn threads,但是当他们发现PHP不支持多线程的时候,大概会转换思路去用一些不够好的语言,比如Perl。

bitsCN推荐阅读:优秀的PHP开发者是怎样炼成的?

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

<ol class="dp-xml"><li class="alt"><span><span>$</span><span class="attribute"><font color="#ff0000">hosts</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">array</font></span><span>("host1.sample.com", "host2.sample.com", "host3.sample.com");  </span></span></li><li><span>$</span><span class="attribute"><font color="#ff0000">timeout</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">15</font></span><span>;  </span></li><li class="alt"><span>$</span><span class="attribute"><font color="#ff0000">status</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">array</font></span><span>();  </span></li><li><span>foreach ($hosts as $host) {   </span></li><li class="alt"><span>        $</span><span class="attribute"><font color="#ff0000">errno</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">0</font></span><span>;   </span></li><li><span>        $</span><span class="attribute"><font color="#ff0000">errstr</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">""</font></span><span>;   </span></li><li class="alt"><span>        $</span><span class="attribute"><font color="#ff0000">s</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">fsockopen</font></span><span>($host, 80, $errno, $errstr, $timeout);   </span></li><li><span>        if ($s) {    </span></li><li class="alt"><span>             $status[$host] = "Connectedn";    </span></li><li><span>             fwrite($s, "HEAD / HTTP/1.0rnHost: $hostrnrn");    </span></li><li class="alt"><span>            do {     </span></li><li><span>                $</span><span class="attribute"><font color="#ff0000">data</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">fread</font></span><span>($s, 8192);     </span></li><li class="alt"><span>                if (strlen($data) == 0) {     </span></li><li><span>                break;     </span></li><li class="alt"><span>                }     </span></li><li><span>             $status[$host] </span><span class="attribute"><font color="#ff0000">.</font></span><span>= $data;    </span></li><li class="alt"><span>         }   </span></li><li><span>         while (true);    </span></li><li class="alt"><b>/本文来源gao@!dai!ma.com搞$$代^@码5网@</b><strong>搞代gaodaima码</strong><span>            fclose($s);   </span></li><li><span>          }   </span></li><li class="alt"><span>         else {    </span></li><li><span>              $status[$host] = "Connection failed: $errno $errstrn";   </span></li><li class="alt"><span>         }  </span></li><li><span>}  </span></li><li class="alt"><span>print_r($status);  </span></li><li><span class="tag"><strong><font color="#006699">?></font></strong></span><span> </span></li></ol>

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:巧妙解决PHP无法实现多线程的问题_PHP
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址