我一直在调试我们在同一 VLAN 上的两台服务器之间发出的一些 Soap 请求。一台服务器上的应用程序是用 PHP 编写的,另一台服务器上的应用程序是用 Java 编写的。我可以控制和更改 PHP 代码,但不能影响 Java 服务器。PHP 应用程序使用 DOMDocument 对象形成 XML,然后使用 cURL 扩展发送请求。
当soap请求的完成时间超过5分钟时,它会一直等到最大超时限制并退出,并显示如下消息:
900000 毫秒后操作超时,收到 0 个字节
在嗅探正在发送的数据包后,事实证明问题是由网络中的 5 分钟超时引起的,该超时正在关闭它认为是陈旧的连接。有两种方法可以修复它:增加 iptables 中的超时时间,或者开始通过请求发送 KeepAlive 数据包。
为了彻底,我想实施这两种解决方案。提高超时时间对操作来说很容易,但发送 KeepAlive 数据包却变得很困难。cURL 库本身支持这一点(请参阅 CLI 应用程序的--keepalive-time标志),但似乎PHP cURL 库中没有实现这一点。我什至检查了源代码以确保它不是未记录的功能。
所以我的问题是:我怎么能把这些数据包发送出去?我看到了一些明确的选项,但我不喜欢其中任何一个:
- 编写一个包装器,它将通过shell_exec启动 CLI 应用程序的请求。这是一个我不喜欢的 hack
- 更新 cURL 扩展以支持这一点。根据 Ops,这是一个不可选项。
- 自己打开插座。我知道就够危险了。我也没有看到用 fsockopen 做到这一点的方法,但我可能会遗漏一些东西。
- 切换到另一个库。支持这一点的存在是什么?
谢谢你尽你所能的帮助。