【问题标题】:SOAP requests are blocking other SOAP requestsSOAP 请求正在阻塞其他 SOAP 请求
【发布时间】:2016-04-21 13:08:15
【问题描述】:

我有一个 WordPress Web 应用程序,它通过 SOAP 与 WCF 服务通信。

假设我访问了一个长时间运行的 SOAP 请求。在另一个选项卡中,我访问了另一个 SOAP 请求,但这个请求运行时间很短。短请求似乎被长时间运行的请求阻止了。

在执行 SOAP 请求时,我为每个请求创建一个新客户端。我不知道 WCF 服务的配置细节,但我确信它能够处理并发请求。这是因为在运行 Web 应用程序的另一个实例时,其他短请求完成,而无需等待 Web 应用程序的第一个实例中长时间运行的请求。

我已经研究过使用某种异步 SOAP 客户端,但我没有找到任何适合我的东西。由于我在这方面找到的信息很少,我想我可能是做错了什么的人。

为什么正在运行的请求会阻塞其他请求?

【问题讨论】:

    标签: php wcf soap soap-client


    【解决方案1】:

    这与 WCF 无关。您的 PHP 会话文件已被锁定,因此每个浏览器只能有一个并发请求。

    基本上有两种解决方案:

    • 在 Web 服务器上的后台线程或后台进程中启动 WCF 调用。这样处理浏览器请求的PHP脚本可以立即返回。

    • 更改 WCF 服务,使其不会立即执行,而是接受“开始工作”调用,您可以轮询执行结果。

    【讨论】:

    • 关于如何在后台线程上运行调用的任何建议?有什么资源可以帮助我实现这一目标?我以前从未在后台线程上运行过 WCF 调用。
    • 不,我的意思是在另一个线程上启动长时间运行的 WCF 调用 from PHP,因此脚本继续执行并向浏览器返回响应。然后,您必须将结果存储在数据库或其他任何地方,以便在 WCF 调用完成时通知(或轮询)客户端。
    • 长时间运行的请求将仅通过我提供的 REST API(在同一 PHP 实例中)运行。能不能把这个分开,让普通网页不被PHP会话文件锁定?
    • 是的,这是可能的,但我的 PHP 知识还不足以推荐一种方法。尝试搜索“php start background job”之类的内容。例如,您可以启动 exec("wget ...") 在同一站点上调用 PHP 脚本。
    • 我想我可能误解了这个问题的真实性。我认为这个问题会影响多个用户。正如你所说,我用不同的浏览器尝试了这个,锁定不再发生。会话文件锁定可能与特定用户相关联,并且实际上是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2015-09-11
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    相关资源
    最近更新 更多