Fehler beim Abrufen von HTTP-Headern in SoapClient
Lesezeit: 7 Minuten
Cris
Ich versuche, einen WS über https auf einem Remote-Host aufzurufen: Remote-Port und ich bekomme:
Fehler bei dem Abrufen von HTTP-Headern
mit dem PHP5 SoapClient; Ich kann die Liste der Funktionen erhalten, indem ich es tue $client->__getFunctions() aber wenn ich anrufe $client->myFunction(...) Ich bekomme immer diesen Fehler.
Ich habe gegoogelt und festgestellt, dass dies zunimmt default_socket_timeout in php.ini sollte es beheben, aber es hat nicht funktioniert.
Hm … tut es ini_set('user_agent','somerandomuseragent'); Hilfe? Haben Sie versucht, diesen Dienst manuell anzufordern?
– Wrikken
22. Februar 2012 um 22:06 Uhr
Wenn ich über Lynx oder Curl eine manuelle Anfrage an den WS mache, läuft es einwandfrei; habe versucht, user_agent zu setzen, aber ohne Erfolg
– Kris
22. Februar 2012 um 22:09 Uhr
Diese Fehlermeldung wird häufig nach einem default_socket_timeout angezeigt. Kann man seinen Wert mit ini_set erhöhen?
– cmbuckley
22. Februar 2012 um 22:35 Uhr
@Cris Hallo Cris, hast du dieses Problem gelöst? Ich habe auch das gleiche Problem und muss das Problem beheben 🙂
– Webster
22. Februar 2016 um 8:07 Uhr
Dies kann immer noch einer der Gründe für diesen Fehler sein. Hat bei mir funktioniert. Danke
– Amir Daneshkar
8. September 2021 um 15:10 Uhr
cmbuckley
Dieser Fehler tritt häufig auf, wenn die default_socket_timeout Wert für die SOAP-Antwort überschritten wird. (Siehe diesen Link.)
Hinweis vom SoapClient-Konstruktor: the connection_timeout Die Option wird zum Definieren eines Timeout-Werts für die Verbindung zum Dienst verwendet, nicht für das Timeout für seine Antwort.
Sie können es wie folgt erhöhen:
ini_set('default_socket_timeout', 600); // or whatever new value you want
Dies sollte Ihnen sagen, ob das Timeout das Problem ist oder ob Sie ein anderes Problem haben. Bedenke, dass Sie sollten dies nicht als dauerhafte Lösung verwenden, sondern um zu sehen, ob der Fehler behoben wird, bevor Sie mit der Untersuchung fortfahren, warum der SOAP-Dienst so langsam reagiert. Wenn der Dienst durchgehend so langsam ist, müssen Sie möglicherweise eine Offline-/Batch-Verarbeitung in Erwägung ziehen.
Ich habe versucht, es auf 600 zu erhöhen, aber immer bekommen [“faultstring”]=> string(27) “Fehler beim Abrufen der HTTP-Header”
– Kris
22. Februar 2012 um 23:16 Uhr
OK, dann wiederholen Sie den obigen Vorschlag von Wrikken, außer dass es nicht ini_set sein soll, sondern eine andere Option in Ihrem Array, die an den Konstruktor übergeben wird. Ich vermute, er schlug dies basierend auf vor PHP #37054, und Ihr Fehler könnte ähnlich sein. Versuchen Sie eine manuelle Anfrage mit curl und -H "User-Agent:" und prüfen Sie, ob Sie in der Antwort einen Location-Header erhalten.
– cmbuckley
22. Februar 2012 um 23:27 Uhr
Vielen Dank für Ihre Aufmerksamkeit; Ich habe versucht, wie Sie vorgeschlagen haben, aber ohne Möglichkeit; Wenn ich curl mache, sehe ich … kann es helfen?
– Kris
23. Februar 2012 um 0:05 Uhr
Ehrlich gesagt, gibt es jemals eine Situation, in der Sie dem Benutzer erlauben möchten, dort zu sitzen und zu warten 600 Sekunden für eine Antwort? Bisher habe ich 3 Stackoverflow-Beiträge mit dieser Frage gefunden, und die Leute schlagen immer wieder vor, das Zeitlimit zu erhöhen. Es ist keine Überraschung, dass die Antworten nicht akzeptiert werden. Ich habe das Problem noch nicht gelöst, aber ich vermute, dass es ein Netzwerk-/Socket-bezogenes Problem ist, das dies normalerweise verursacht.
– Manachi
22. Januar 2013 um 6:02 Uhr
Um ehrlich zu sein, ist es keine großartige Antwort – 600 Sekunden waren nur eine dumm hohe Zahl, auf die ich durch Hinzufügen einer zusätzlichen Null gekommen bin 🙂 Fairerweise habe ich es nur als Versuch gemeint, um zu sehen, ob es den Fehler verhindert hat, also Sie könnte die tatsächliche Reaktionszeit abschätzen. Aber wenn dies tatsächlich das Problem war und die Antwort länger als 60 Sekunden dauerte, dann wäre es wahrscheinlich relevanter, diese Antwortzeit anzugehen!
– cmbuckley
24. Juni 2013 um 21:24 Uhr
Ich wollte nur die Lösung für dieses Problem in meiner spezifischen Situation teilen (ich hatte identische Symptome). In meinem Szenario stellte sich heraus, dass dem vom Webdienst bereitgestellten SSL-Zertifikat nicht mehr vertraut wurde. Es stellte sich heraus, dass es an einer neuen Firewall lag, die der Client installiert hatte und die die SOAP-Anforderung störte, aber das Endergebnis war, dass das Zertifikat nicht korrekt bereitgestellt/vertrauenswürdig wurde.
Es war ein bisschen schwierig aufzuspüren, weil der SoapClient-Aufruf (selbst mit trace=1) kein sehr hilfreiches Feedback gibt.
Ich konnte das nicht vertrauenswürdige Zertifikat beweisen, indem ich Folgendes verwendete:
openssl s_client -connect <web service host>:<port>
Ich weiß, dass dies nicht die Antwort auf alle Probleme sein wird, aber hoffentlich hilft es jemandem. In jedem Fall denke ich, dass es wichtig ist zu erkennen, dass die Ursache dieses Fehlers (Fehlercode: „HTTP“ Fehlerzeichenfolge: „Error Fetching http headers“) normalerweise ein Netzwerk-/Socket-/Protokoll-/Kommunikationsproblem sein wird und nicht einfach „nicht genug zulassen Zeit für die Anfrage”. Ich kann mir nicht vorstellen, dass das Erweitern des Werts default_socket_timeout dieses Problem sehr oft lösen wird, und selbst wenn dies der Fall ist, wäre es sicherlich besser, das Problem zu lösen, warum es überhaupt so langsam ist.
Sanjay Mohnani
Ich hatte das gleiche Problem und habe alle oben genannten Lösungen ausprobiert. Leider hat nichts funktioniert.
Socket Timeout (hat nicht funktioniert)
User Agent (hat nicht funktioniert)
SoapClient-Konfiguration, cache_wsdl und Bleib am Leben etc…
Ich habe mein Problem gelöst, indem ich die hinzugefügt habe Kompression Header-Eigenschaft. Dies ist tatsächlich erforderlich, wenn Sie eine Antwort erwarten gzip komprimiertes Format.
‘user_agent’ => ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0’, verringert die Reaktionszeit um 100 %
– Ahmed Abud
29. März 2021 um 13:28 Uhr
Ich nehme an, es ist zu spät, aber ich habe das gleiche Problem. Ich versuche das Socket-Timeout, aber es funktioniert nicht. Mein Problem war, dass der Client und der Server auf demselben physischen Server waren. Wenn der Client-Code auf demselben physischen Server arbeitet, erhalte ich diesen Fehler, aber wenn derselbe Client-Code auf meinen Localhost verschoben wird und den Server anfordert (Client und Server wurden auf zwei verschiedenen Maschinen ausgeführt), funktioniert alles einwandfrei.
Vielleicht kann das jemand anderem helfen!
Thiago Sähler
Einstellung 'keep_alive' zu falsch hat bei mir funktioniert:
new SoapClient($api_url, array('keep_alive' => false));
Die Konfiguration, die für mich funktioniert hat, war die Definition der folgenden Parameter in meinem PHP-Skript:
Die wichtigste Parameterdefinition war nach meiner Erfahrung mit diesem Problem
ini_set('default_socket_timeout', 5000);
Während meiner Tests habe ich das default_socket_timeout auf 5 Sekunden definiert und der Fehler „Error Fetching http headers“ wurde sofort ausgelöst.
Ich hoffe es hilft dir!
Borq
Ich wollte nur der Vollständigkeit halber hinzufügen, dass ich ähnlich wie bei Manachi diese Nachricht erhalten habe, weil das von mir verwendete Client-Zertifikat eine Passphrase erforderte und ich versehentlich ein zusätzliches Zeichen am Ende der Passphrase hatte. Dieser Beitrag soll nur einen weiteren Vorschlag machen, worauf man achten sollte. Wenn der Host die Verwendung eines Client-Zertifikats (über den Parameter local_cert) erfordert, stellen Sie sicher, dass Sie den richtigen Pfad zum Zertifikat und die richtige Passphrase (falls erforderlich) angeben. Wenn Sie dies nicht tun, wird höchstwahrscheinlich dieselbe Fehlermeldung angezeigt.
13291000cookie-checkFehler beim Abrufen von HTTP-Headern in SoapClientyes
Hm … tut es
ini_set('user_agent','somerandomuseragent');
Hilfe? Haben Sie versucht, diesen Dienst manuell anzufordern?– Wrikken
22. Februar 2012 um 22:06 Uhr
Wenn ich über Lynx oder Curl eine manuelle Anfrage an den WS mache, läuft es einwandfrei; habe versucht, user_agent zu setzen, aber ohne Erfolg
– Kris
22. Februar 2012 um 22:09 Uhr
Diese Fehlermeldung wird häufig nach einem default_socket_timeout angezeigt. Kann man seinen Wert mit ini_set erhöhen?
– cmbuckley
22. Februar 2012 um 22:35 Uhr
@Cris Hallo Cris, hast du dieses Problem gelöst? Ich habe auch das gleiche Problem und muss das Problem beheben 🙂
– Webster
22. Februar 2016 um 8:07 Uhr
Dies kann immer noch einer der Gründe für diesen Fehler sein. Hat bei mir funktioniert. Danke
– Amir Daneshkar
8. September 2021 um 15:10 Uhr