En PHP, comment effacer un cache WSDL?


88

À travers php_info()où se trouve le cache WSDL ( /tmp), mais je ne sais pas nécessairement s'il est sûr de supprimer tous les fichiers commençant par WSDL.

Oui, je devrais pouvoir tout supprimer /tmp, mais je ne sais pas ce que cela pourrait avoir d'autre si je supprimais tous les fichiers WSDL.

Réponses:


196

Vous pouvez supprimer en toute sécurité les fichiers de cache WSDL. Si vous souhaitez empêcher la mise en cache future, utilisez:

ini_set("soap.wsdl_cache_enabled", 0);

ou dynamiquement:

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

31
Je pense que lors de l'utilisation de SoapClient, au lieu de coder en dur un 0, il est recommandé d'utiliser la constante WSDL_CACHE_NONE définie. Voir php.net/manual/en/soapclient.soapclient.php
Dan Burton

Quoi qu'il en soit, je peux laisser la fonctionnalité de mise en cache telle quelle, mais comment invalider tout le cache pour un moment? Nous pouvons faire ces choses facilement dans .net etc
Kamran Shahid

Cette solution efface le cache, mais c'est aussi un compromis pour les performances.
Nabeel Arshad

5
Pour effacer réellement le cache, même si les fichiers / tmp ont été supprimés, je recevais toujours des problèmes de cache wsdl jusqu'à ce que j'utilise ce paramètre ini_set('soap.wsdl_cache_ttl', 1);et que je le laisse reposer pendant une heure - trouvé ici: stackoverflow.com/questions/323561/…
Joshua Fricke

26

Supprimez tous les wsdl*fichiers de votre /tmpdossier sur le serveur.

Les fichiers WSDL sont mis en cache dans votre emplacement par défaut pour tous les fichiers de cache définis dans php.ini. Même emplacement que vos fichiers de session.


Pouvez-vous s'il vous plaît me faire savoir où se trouve ce dossier tmp?
Kamran Shahid du

2
C'est à / tmp. Php peut être configuré pour utiliser un emplacement différent, vous pouvez le localiser en faisant php -i | grep wsdl_cache_dir
siliconrockstar

C'était tout pour moi. Remarque: J'utilisais docker-compose , j'ai donc dû exécuter docker-compose rm <container> avant de faire un nouveau docker-compose up .
conradkleinespel

Vous pouvez localiser le dossier pour le cache wsdl avec "php -i | grep soap.wsdl_cache_dir"
Daniel K. Mueller

13

si vous avez déjà déployé le code ou que vous ne pouvez modifier aucune configuration, vous pouvez supprimer tous les fichiers temporaires de wsdl:

rm /tmp/wsdl-*

2
C'est aussi ce que je fais, bien sûr au cas où vous utiliseriez WSDL_CACHE_DISK
carlosvini

Sous Windows, la valeur par défaut est c: \ tmp
b3wii

12

Je recommande d'utiliser un cache-buster dans l'url wsdl.

Dans nos applications, nous utilisons un identifiant de révision SVN dans l'url wsdl afin que le client soit immédiatement informé des changements de structures. Cela fonctionne sur notre application car, chaque fois que nous changeons le côté serveur, nous devons également ajuster le client en conséquence.

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

Cela nécessite que svn soit configuré correctement. Ce n'est pas activé par défaut sur tous les référentiels.

Dans le cas où vous n'êtes pas responsable des deux composants (serveur, client) ou si vous n'utilisez pas SVN, vous pouvez trouver un autre indicateur qui peut être utilisé comme cache-buster dans votre URL wsdl.


7
Certains serveurs SOAP ne serviront pas le WSDL si un autre paramètre est présent.
Raphael Riel

4

Juste pour des raisons de documentation:

J'ai maintenant (2014) observé que de toutes ces approches valables et correctes, une seule a réussi. J'ai ajouté une fonction au WSDL sur le serveur et le client ne reconnaissait pas la nouvelle fonction.

  • L'ajout WSDL_CACHE_NONEdes paramètres n'a pas aidé.
  • L'ajout du cache-buster n'a pas aidé.
  • La configuration soap.wsdl_cache_enabledde l'ini PHP a aidé.

Je ne sais maintenant pas s'il s'agit de la combinaison des trois, ou si certaines fonctionnalités sont terriblement implémentées de sorte qu'elles peuvent rester inutiles au hasard, ou s'il existe une hiérarchie de fonctionnalités non comprises.

Alors enfin, attendez-vous à ce que vous deviez cocher les trois pour résoudre de tels problèmes.


FYI ini_set ("soap.wsdl_cache_enabled", WSDL_CACHE_NONE); a bien fonctionné pour moi
hobailey

0

Modifiez votre php.inifichier, recherchez soap.wsdl_cache_enabledet définissez la valeur sur0

[soap]
; Enables or disables WSDL caching feature.
; http://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=0
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.