如何使用 ? 对 Web 服务进行异步调用PHP SOAP Extension
?
9 回答
我的直接答案应该是:你不能。
PHP 不具备可在“用户空间”中使用的线程能力。
现在,如果你真的想这样做,有一些方法可以绕过它:
- 使用 exec 函数在后台生成另一个进程,并通过数据库/文件系统或其他方式对其进行监视。
- 使用 fork 函数生成另一个进程并通过数据库/文件系统或其他方式对其进行监视。
这两种方法的缺点是您可以使其异步,但如果您想要回调,那么它将非常棘手,而且一点也不简单。好吧,它甚至不会是回调,因为您将无法在进行异步调用的脚本上等待它。这意味着您只能拥有某种监控方案。我建议使用 AJAX。
您需要编写一个在客户端断开连接后继续处理的 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;
}
}
如果您使用 curl,它有一组“多”调用以允许并行调用多个服务器......
这可能会有所帮助,(并行远程过程调用):http ://en.dklab.ru/lib/Dklab_SoapClient/
一种方法是使用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/
使用 AJAX 类型调用在客户端而不是服务器端进行。
如果您有能力在 Linux 中执行命令行 php 调用,则可以执行pnctl_fork命令并从分叉的子进程调用 Web 服务。
试试他们在我的问题中给我的方法: 异步 PHP 调用?
我不知道为什么古斯塔沃被改装了,因为他的答案是正确的。
我使用 exec 来运行一个用 PHP 编写的与 google API 联系的 shell 脚本。我这样启动脚本:
run.php 参数1=1 参数2=2 &> ajax.txt
运行的最后一行是
回声“完成”
然后我的 ajax 不断轮询 'ajax.txt' 直到它发现进程已经完成。
哈克,但简单(亲吻)
和尚男孩