Wie können Sie in PHP einen WSDL-Cache löschen?


88

In durch , php_info()wo der WSDL - Cache gehalten ( /tmp), aber ich weiß nicht unbedingt , wenn sie alle Dateien zu löschen , beginnend mit WSDL sicher ist.

Ja, ich sollte in der Lage sein, einfach alles zu löschen /tmp, aber ich weiß nicht, was dies sonst noch bewirken könnte, wenn ich alle WSDL-Dateien lösche.

Antworten:


196

Sie können die WSDL-Cache-Dateien sicher löschen. Wenn Sie zukünftiges Caching verhindern möchten, verwenden Sie:

ini_set("soap.wsdl_cache_enabled", 0);

oder dynamisch:

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

31
Ich glaube, wenn Sie SoapClient verwenden, wird empfohlen, anstelle der Hardcodierung einer 0 die definierte Konstante WSDL_CACHE_NONE zu verwenden. Siehe php.net/manual/en/soapclient.soapclient.php
Dan Burton

Wie auch immer, ich kann die Caching-Funktionalität so lassen, wie sie ist, aber wie kann der gesamte Cache vorerst ungültig werden? Wir können diese Dinge leicht in .net usw. tun
Kamran Shahid

Diese Lösung löscht zwar den Cache, ist aber auch ein Kompromiss für die Leistung.
Nabeel Arshad

5
Um den Cache tatsächlich zu leeren, bekam ich, obwohl die / tmp-Dateien entfernt wurden, immer noch Probleme mit dem WSDL-Cache, bis ich diese Einstellung verwendete ini_set('soap.wsdl_cache_ttl', 1);und sie eine Stunde lang stehen ließ - hier zu finden: stackoverflow.com/questions/323561/…
Joshua Fricke

26

Entfernen Sie alle wsdl*Dateien in Ihrem /tmpOrdner auf dem Server.

WSDL-Dateien werden für alle in php.ini definierten Cache-Dateien an Ihrem Standardspeicherort zwischengespeichert. Gleicher Speicherort wie Ihre Sitzungsdateien.


Können Sie mir bitte mitteilen, wo sich dieser tmp-Ordner befindet?
Kamran Shahid

2
Es ist bei / tmp. PHP kann so eingestellt werden, dass es einen anderen Speicherort verwendet. Sie können ihn mithilfe von PHP -i | lokalisieren grep wsdl_cache_dir
siliconrockstar

Das war es für mich. Hinweis: Ich habe Docker-Compose verwendet , daher musste ich Docker-Compose rm <Container> ausführen , bevor ich ein neues Docker-Compose erstellen konnte .
Conradkleinespel

Sie können den Ordner für den WSDL-Cache mit "php -i | grep soap.wsdl_cache_dir"
Daniel K. Mueller

13

Wenn Sie den Code bereits bereitgestellt haben oder keine Konfiguration ändern können, können Sie alle temporären Dateien aus wsdl entfernen:

rm /tmp/wsdl-*

2
Es ist auch das, was ich tue, natürlich für den Fall, dass Sie WSDL_CACHE_DISK
carlosvini

Unter Windows ist es standardmäßig c: \ tmp
b3wii

12

Ich empfehle die Verwendung eines Cache-Buster in der wsdl-URL.

In unseren Apps verwenden wir eine SVN-Revisions-ID in der wsdl-URL, damit der Client sofort über sich ändernde Strukturen informiert wird. Dies funktioniert in unserer App, da wir bei jedem Wechsel der Serverseite auch den Client entsprechend anpassen müssen.

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

Dies erfordert, dass svn richtig konfiguriert ist. Nicht in allen Repositorys ist dies standardmäßig aktiviert.

Falls Sie nicht für beide Komponenten (Server, Client) verantwortlich sind oder SVN nicht verwenden, finden Sie möglicherweise einen weiteren Indikator, der als Cache-Buster in Ihrer WSDL-URL verwendet werden kann.


7
Einige SOAP-Server bedienen die WSDL nicht, wenn ein anderer Parameter vorhanden ist.
Raphael Riel

4

Nur aus Gründen der Dokumentation:

Ich habe jetzt (2014) festgestellt, dass von all diesen wertvollen und korrekten Ansätzen nur einer erfolgreich war. Ich habe der WSDL auf dem Server eine Funktion hinzugefügt, und der Client hat die neue Funktion nicht erkannt.

  • Das Hinzufügen WSDL_CACHE_NONEzu den Parametern hat nicht geholfen.
  • Das Hinzufügen des Cache-Buster hat nicht geholfen.
  • Das Einstellen soap.wsdl_cache_enabledauf PHP ini hat geholfen.

Ich bin mir jetzt nicht sicher, ob es sich um die Kombination aller drei handelt oder ob einige Funktionen schrecklich implementiert sind, so dass sie zufällig unbrauchbar bleiben, oder ob eine Hierarchie von Funktionen nicht verstanden wird.

Erwarten Sie also schließlich, dass Sie alle drei überprüfen müssen, um Probleme wie diese zu lösen.


FYI ini_set ("soap.wsdl_cache_enabled", WSDL_CACHE_NONE); funktionierte gut für mich
Hobailey

0

Bearbeiten Sie Ihre php.iniDatei, suchen Sie nach soap.wsdl_cache_enabledund setzen Sie den Wert auf0

[soap]
; Enables or disables WSDL caching feature.
; http://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.