4

如何使用 ? 对 Web 服务进行异步调用PHP SOAP Extension

4

9 回答 9

4

我的直接答案应该是:你不能。
PHP 不具备可在“用户空间”中使用的线程能力。

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

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

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

于 2008-09-24T17:59:47.243 回答
1

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

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

class NonBlockingSoapServer extends SoapServer
{
    public function handle()
    {
        // this script can run forever
        set_time_limit(0);

        // tell the client the request has finished processing
        header('Location: index.php');  // redirect (optional)
        header('Status: 200');          // status code
        header('Connection: close');    // disconnect

        // clear ob stack 
        @ob_end_clean();

        // continue processing once client disconnects
        ignore_user_abort();

        ob_start();
        /* ------------------------------------------*/
        /* this is where regular request code goes.. */
        $result = parent::handle();
        /* end where regular request code runs..     */
        /* ------------------------------------------*/
        $iSize = ob_get_length();
        header("Content-Length: $iSize");

        // if the session needs to be closed, persist it
        // before closing the connection to avoid race
        // conditions in the case of a redirect above
        session_write_close();

        // send the response payload to the client
        @ob_end_flush();
        flush();

        /* ------------------------------------------*/
        /* code here runs after the client diconnect */
        /* YOUR ASYNC CODE HERE ......               */

        return $result;
    }
}
于 2013-10-03T04:40:58.887 回答
1

如果您使用 curl,它有一组“多”调用以允许并行调用多个服务器......

于 2009-08-12T11:07:36.807 回答
1

这可能会有所帮助,(并行远程过程调用):http ://en.dklab.ru/lib/Dklab_SoapClient/

于 2011-01-10T19:36:11.147 回答
1

一种方法是使用select()CURL 的“multi”包提供的 ing 方法,通过扩展SoapClient类并实现您自己的__doRequest.

我发现的最小的工作示例可以下载https://github.com/halonsecurity/sp-enduser/blob/master/inc/soap.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);

如此处所述http://www.halon.se/blogs/making-phps-soap-client-asynchronous/

于 2013-11-28T09:49:39.703 回答
0

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

于 2008-09-24T22:36:14.023 回答
0

如果您有能力在 Linux 中执行命令行 php 调用,则可以执行pnctl_fork命令并从分叉的子进程调用 Web 服务。

于 2008-09-24T18:14:03.870 回答
0

试试他们在我的问题中给我的方法: 异步 PHP 调用?

于 2008-09-24T23:52:03.327 回答
0

我不知道为什么古斯塔沃被改装了,因为他的答案是正确的。

我使用 exec 来运行一个用 PHP 编写的与 google API 联系的 shell 脚本。我这样启动脚本:

run.php 参数1=1 参数2=2 &> ajax.txt

运行的最后一行是

回声“完成”

然后我的 ajax 不断轮询 'ajax.txt' 直到它发现进程已经完成。

哈克,但简单(亲吻)

和尚男孩

于 2008-10-02T09:07:31.503 回答