ChatGPT解决这个技术问题 Extra ChatGPT

In PHP how can you clear a WSDL cache?

In through php_info() where the WSDL cache is held (/tmp), but I don't necessarily know if it is safe to delete all files starting with WSDL.

Yes, I should be able to just delete everything from /tmp, but I don't know what else this could effect if I delete any all WSDL files.


B
Brock Adams

You can safely delete the WSDL cache files. If you wish to prevent future caching, use:

ini_set("soap.wsdl_cache_enabled", 0);

or dynamically:

$client = new SoapClient('http://somewhere.com/?wsdl', array('cache_wsdl' => WSDL_CACHE_NONE) );

I believe that when using SoapClient, instead of hardcoding a 0, it is recommended that you use the defined constant WSDL_CACHE_NONE. See php.net/manual/en/soapclient.soapclient.php
Anyway I can let the caching funtionality as it is but some how invalidate all cache for a time being? We can do these things easily in .net e.t.c.
This solution do clears the cache but it is also a trade off for the performance.
For actually clearing the cache, even though the /tmp files were removed I still was getting wsdl cache issues until I used this setting ini_set('soap.wsdl_cache_ttl', 1); and let it sit for an hour - found here: stackoverflow.com/questions/323561/…
M
Machavity

Remove all wsdl* files in your /tmp folder on the server.

WSDL files are cached in your default location for all cache files defined in php.ini. Same location as your session files.


Can you please let me know where this tmp folder reside?
It's at /tmp . Php may be set to use a different location, you can locate it by doing php -i | grep wsdl_cache_dir
This was it for me. Note: I was using docker-compose, so I had to run docker-compose rm before doing a new docker-compose up.
You can locate the folder for the wsdl cache with "php -i | grep soap.wsdl_cache_dir"
M
Markomafs

if you already deployed the code or can't change any configuration, you could remove all temp files from wsdl:

rm /tmp/wsdl-*

It's also what i do, of course in case you're using WSDL_CACHE_DISK
On Windows it defaults to c:\tmp
s
staabm

I recommend using a cache-buster in the wsdl url.

In our apps we use a SVN Revision id in the wsdl url so the client immediately knows of changing structures. This works on our app because, everytime we change the server-side, we also need to adjust the client accordingly.

$client = new SoapClient('http://somewhere.com/?wsdl&rev=$Revision$');

This requires svn to be configured properly. Not on all repositories this is enabled by default.

In case you are not responsible for both components (server,client) or you don't use SVN you may find another indicator which can be utilised as a cache-buster in your wsdl url.


Some SOAP server won't serve the WSDL if another parameter is present.
p
peter_the_oak

Just for the reason of documentation:

I have now (2014) observed that from all these valuable and correct approaches only one was successful. I've added a function to the WSDL on the server, and the client wasn't recognizing the new function.

Adding WSDL_CACHE_NONE to the parameters didn't help.

Adding the cache-buster didn't help.

Setting soap.wsdl_cache_enabled to the PHP ini helped.

I am now unsure if it is the combination of all three, or if some features are terribly implemented so they may remain useless randomly, or if there is some hierarchy of features not understood.

So finally, expect that you have to check all three to solve problems like these.


FYI ini_set("soap.wsdl_cache_enabled", WSDL_CACHE_NONE); worked fine for me
K
Kiran Reddy

Edit your php.ini file, search for soap.wsdl_cache_enabled and set the value to 0

[soap]
; Enables or disables WSDL caching feature.
; http://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=0