我已经制作了SOAP WSDL服务。我添加了两种测试方法 - 第一种(setX($ x))将$ this-> x设置为$ x,第二种(getX())返回$ this-> x。我的SOAP类的构造函数将$ this-> x设置为'FAIL',而客户端代码调用setX('SUCCESS')。
我添加了一些虚拟变量,使它们都成为请求 - 响应类型(单向似乎对某些客户端有一些奇怪的问题)。
嗯,它有效,客户端调用$ s-> setX('SUCCESS')和$ x = $ s-> getX(''),$ x ='SUCCESS'。正如所料。
但要实现这一点,我必须在客户端使用以下选项:
'cache_wsdl'=> WSDL_CACHE_MEMORY
为什么呢?它打败了我。对于其他所有选项,它只是不起作用 - $ x ='FAIL'(没有持久性)
好的,它有效,那么问题是什么?有时,是的,有时它不起作用。代码随机返回'FAIL'(因为持久性被破坏)。当它开始返回'FAIL'时它会继续这样做。你可以启动另一个浏览器,它最可能会报告'SUCCESS'。
现在最奇怪的部分。我们使用一个浏览器。让我们重复以下步骤:启动浏览器,检查代码输出,直到它返回'FAIL'。现在,按“Ctrl + R”约2秒钟。突然它起作用,现在每次都是'成功'!
WTF?!我真的仔细检查过会议。每次创建SoapServer之前都会正确创建会话。每次调用$ server-> setPersistence(SOAP_PERSISTENCE_SESSION)。它只在“大部分时间”起作用 - 这使它完全没用!
任何线索?
PS:我的服务WSDL已生成并缓存。我已经将sleep(1)添加到WSDL生成器,并对客户端代码进行了基准测试。似乎没有重新生成WSDL(以大约10毫秒结束 - 不是1010毫秒)。使WSDL缓存无效(TTL设置为1)不会使持久性工作,但是在浏览器中按住Ctrl + R会愚蠢!
PS2:WSDL生成器,SOAP类和测试客户端分为3个不同的文件。 WSDL类实际上启动了服务器。它是从包含SOAP类(index.php)的文件中调用的。
PS3:我删除了.htaccess,它不会破坏任何东西,我删除了一些未使用的文件和代码,并且繁荣 - 现在每次都可以使用任何类型的wsdl_cache!好吧,我不知道它是什么,.htaccess?也许是Apache服务器内部问题。我再也无法重现它了。如果您遇到类似的问题,我的建议是删除.htaccess并尝试重新启动Apache。问题发生在非常清晨/深夜 - 我不确定,但我认为cron当时做了一些密集的备份任务。也许强制性重新加载告诉Linux放松后台任务并为Apache和PHP提供更多资源 - 这可以解释奇怪的Ctrl + R行为。更新:它仍然随机失败!工作大部分时间,但我不能依赖这个功能。 (使用不同的服务,不同的客户端,但仍然是相同的服务器测试)。