PHP异步Web服务

PHP异步Web服务,php,web-services,asynchronous,Php,Web Services,Asynchronous,如何使用PHPSOAP扩展对web服务进行异步调用?我的直接答案应该是:你不能。 PHP没有可以在“userland”中使用的线程能力 现在,如果你真的想这样做,有一些方法可以绕过它: 使用exec函数在后台生成另一个进程,并通过数据库/文件系统或其他方式对其进行监视 使用fork函数生成另一个进程,并通过数据库/文件系统或其他方式监视它 这两种方法的缺点是可以使其异步化,但如果需要回调,那么它将非常棘手,一点也不琐碎。好吧,它甚至不会是回调,因为你不能在进行异步调用的脚本上等待它。这意味着您只

如何使用
PHPSOAP扩展对web服务进行异步调用?

我的直接答案应该是:你不能。
PHP没有可以在“userland”中使用的线程能力

现在,如果你真的想这样做,有一些方法可以绕过它:

  • 使用exec函数在后台生成另一个进程,并通过数据库/文件系统或其他方式对其进行监视
  • 使用fork函数生成另一个进程,并通过数据库/文件系统或其他方式监视它

  • 这两种方法的缺点是可以使其异步化,但如果需要回调,那么它将非常棘手,一点也不琐碎。好吧,它甚至不会是回调,因为你不能在进行异步调用的脚本上等待它。这意味着您只能有某种监视方案。我建议使用AJAX。

    如果您能够在Linux中执行命令行php调用,您可以执行命令并从分叉子进程调用web服务。

    使用AJAX类型调用在客户端而不是服务器端执行。

    试试他们在我的问题中给我的方法:
    我不知道为什么古斯塔沃会被调低,因为他的答案是正确的

    我使用exec运行一个用PHP编写的shell脚本,该脚本与googleapi联系。我这样开始脚本:

    run.php param1=1 param2=2&>ajax.txt

    最后一行是

    回声“完成”

    然后,我的ajax会一直轮询“ajax.txt”,直到它发现这个过程已经完成

    刻薄但简单(吻)


    monk.e.boy

    如果使用curl,它有一组“multi”调用,允许对多个服务器进行并行调用……

    这可能会有所帮助,(并行远程过程调用):

    您需要编写一个SoapServer类,在客户端断开连接后继续处理。将为您提供一个起点,但您必须在SoapServer类中封装类似的内容

    它看起来大致是这样的(注意:我没有在SoapServer内部测试过这个,但这给了您一个想法)


    一种方法是使用CURL的“multi”包提供的
    select()
    ing方法,扩展
    SoapClient
    类并实现自己的
    \u doRequest

    我发现的最小的工作示例可以下载并使用如下

    $client1 = new SoapClientAsync('some-systems-wsdl', $options);
    $client2 = new SoapClientAsync('another-systems-wsdl', $options);
    $client1->someFunction($arguments);
    $client2->anotherFunction($arguments);
    soap_dispatch();
    $result1 = $client1->someFunction($arguments);
    $result2 = $client1->anotherFunction($arguments);
    

    如本文所述

    为什么要进行异步调用?异步调用对我来说唯一有意义的时候,是在一个客户机上,您可能同时有多个线程。但是从PHP本身来看,通常是在服务器上,我不确定我是否明白这一点。也许告诉我们你想做什么&我们可以提供更多帮助。看看这篇[帖子][1]它对我有用[1]:如果Web服务是IP受限的怎么办?除非有一个客户端或者所有客户端都在一个NAT路由器后面,否则这是不可能的。如果您需要web服务器上的结果呢?或者使用curl multi:您完全可以在PHP中这样做,而无需生成另一个进程;您使用现有进程,并在客户端断开连接后使其继续运行。
    $client1 = new SoapClientAsync('some-systems-wsdl', $options);
    $client2 = new SoapClientAsync('another-systems-wsdl', $options);
    $client1->someFunction($arguments);
    $client2->anotherFunction($arguments);
    soap_dispatch();
    $result1 = $client1->someFunction($arguments);
    $result2 = $client1->anotherFunction($arguments);