PHP多线程调用几个soap服务器

时间:2011-12-29 15:53:57

标签: php multithreading

我必须在一个“for”循环中调用一个需要一秒响应的php函数:

    for ($i=0; $i<count($wsdlTab); $i++)
    {
        $serverLoadTab[$i] = $this->getServerLoad($wsdlTab[$i]);
    }

我的问题是我想为$ wsdlTab [$ i]的每一行同时调用我的getServerLoad($ wsdlTab [$ i])函数,而不必在每个循环上等待一秒钟。

这就是我需要在一个线程中调用该函数的原因。

我已经看到了各种“模拟”线程的方法,但我没有找到任何方法来解决我的问题:

  • 我必须获取getServerLoad($ wsdlTab [$ i])的返回值,然后输入数组
  • Apache服务器在Windows上

提前感谢您的回复。

3 个答案:

答案 0 :(得分:1)

您应该查看Gearman的并行处理:http://gearman.org/

答案 1 :(得分:0)

正如您所发现的那样,PHP并没有内置异步或线程。

在这种情况下我可能会做的是将我需要并行执行的脚本分开,将其放入自己的小型自包含PHP文件中。然后我在一个单独的线程中执行它,将结果存储在我可以在原始线程中监视的地方。一旦所有脚本都返回并填充了结果,或者某些给定的超时,我将继续处理。

所以,例如,

prepareResults(); // something like clearing a db row or zeroing out a file or whatever
for ($i=0; $i<count($wsdlTab); $i++) {
    exec('./doServerLoad.php ' . $wsdlTab[$i] . ' &');
}
while (!waitingForResults()) { // checking the results table/row/file
}
$serverLoadTab = parseTheResults();

答案 2 :(得分:0)

可以使用pcntl_fork()curl_multi在多线程/分叉中请求WSDL,并将它们保存到本地驱动器。然后解析它们:

$soapClient = new SoapClient('WSDLSTemp/wsdl1.wsdl');
// .. do whatever you want...