2009-12-17 4 views
34

Ich habe eine Cron Job-Setup auf einem Server, um ein Backup-Skript in PHP, die auf einem anderen Server gehostet wird, zu starten. Der Befehl, den ich verwendet haben, wird wie folgt formatiert:Curl Error 52 Leere Antwort vom Server

curl -sS http://www.example.com/backup.php 

letzter Zeit habe ich diesen Fehler wurde immer, wenn die Cron läuft

curl: (52) Empty reply from server 

Ich habe keine Ahnung, was das bedeutet. Wenn ich auf den Link direkt in meinem Browser gehe, läuft das Skript gut und ich bekomme meine kleine Backup-Zip-Datei.

Kann jemand irgendwelche Informationen darüber zur Verfügung stellen?

+0

Das hat wirklich nichts mit PHP zu tun, da curl sich nicht darum kümmert, was der Ausgabedateiprozessor ist. –

+1

Kann Ihr Backup-Skript so lange ausgeführt werden, dass es zu einem Timeout der 'curl' kommt? Haben Sie versucht, den Standard-Curl zu erhöhen, um mit '--connect-timeout ' zu verbinden und für den gesamten Vorgang mit '--max-time '? –

Antwort

31

Curl gibt diesen Fehler aus, wenn keine Antwort von einem Server vorliegt, da es ein Fehler für HTTP ist, auf eine Anforderung nicht zu antworten.

Ich vermute, das Problem, das Sie haben, ist, dass es ein Stück Netzwerkinfrastruktur, wie eine Firewall oder ein Proxy, zwischen Ihnen und dem betreffenden Host gibt. Damit dies funktioniert, müssen Sie das Problem mit den Verantwortlichen für diese Hardware besprechen.

+10

Dies ist wahrscheinlich der falsche Ansatz zur Fehlerbehebung. Eine leere Antwort bedeutet, dass sie sich mit dem IP/Port verbinden konnte, aber der Server gab nichts in der Antwort zurück. Es ist wahrscheinlich ein Problem mit dem Dienst selbst. –

+1

Nun, nicht ganz. Als mir das passierte, weil mein Authentifizierungs-Proxy keine Verbindung zum Remote-Host hergestellt hatte. In Wirklichkeit gab es also kein Problem mit dem Dienst selbst. –

+0

In meinem Fall habe ich Proxy, der für Loopback-Schnittstelle deaktiviert ist, wo der Server läuft. – rbaleksandar

2

In meinem Fall wurde dies durch ein PHP-APC-Problem verursacht. Der erste Ort, an dem Sie suchen sollten, wären die Apache-Fehlerprotokolle (wenn Sie Apache verwenden).

Hoffe, das hilft jemandem.

+0

Können Sie etwas mehr erklären? Wie kann dies durch APC verursacht werden? Ich benutze das nicht einmal innerhalb von PHP, ich benutze nur die Befehlszeile. –

+0

Das war so lange her, ich kann mich nicht erinnern, warum APC die Ursache für dieses Problem war. Entschuldigung, ich kann nicht helfen. – Euperia

3

In meinem Fall war es Serverumleitung; curl -L löste mein Problem.

1

Es passiert, wenn Sie versuchen, auf sichere Website wie Https zuzugreifen.

Ich hoffe, dass Sie verpasst 's'

Versuchen URL ändern -sS -u zu kräuseln "username: password" https://www.example.com/backup.php

+1

Sehr nein. Und was ist simple auth "username: password" hat mit https zu tun? –

0

Versuchen this -> Statt gehen durch Wölbungen bildet, die Seite Pingen Sie‘ versuchen, mit Telnet zu erreichen. Die Antwort, die Ihr Verbindungsversuch zurückgibt, ist genau das, was cURL sieht, wenn es versucht, eine Verbindung herzustellen (was aber nicht hilfreich ist). Abhängig davon, was Sie hier sehen, können Sie eine der folgenden Schlussfolgerungen ziehen:

Sie versuchen, eine Verbindung zu einer Website herzustellen, die ein namensbasierter virtueller Host ist, dh sie kann nicht über die IP-Adresse erreicht werden. Mit dem Hostnamen ist etwas falsch gelaufen - Sie haben sich möglicherweise etwas vertippt. Beachten Sie, dass die Verwendung von GET anstelle von POST für Parameter Ihnen eine konkretere Antwort gibt.

Das Problem kann auch mit dem Header 100-continue verknüpft sein. Versuchen Sie, curl_getinfo($ch, CURLINFO_HTTP_CODE) auszuführen, und überprüfen Sie das Ergebnis.

+0

Interessanter Punkt. Ich war tatsächlich in der Lage, den HTML-Code als Antwort mit 'telnet hostname' zu ​​erhalten und 'GET ' –

1

können Sie diese curl versuchen -sS „http://www.example.com/backup.php“ indem Sie Ihre URL in „setzen“ die für mich gearbeitet ich nicht den genauen Grund wissen, aber ich nehme an, dass die URL in setzen „“, um die Anfrage an den Server abgeschlossen oder vervollständigt nur die Header-Anfrage.

13

Dies kann passieren, wenn curl aufgefordert wird, auf einem Server, der HTTPS ausführt, einfach HTTP auszuführen.

Beispiel:

$ curl http://google.com:443 
curl: (52) Empty reply from server 
+2

Das war die Situation in meinem Fall. 'curl localhost: 8443' gab mir den leeren Antwortfehler. 'curl -k https: // localhost: 8443' hat die Seite richtig bedient. –

2

Es kann passieren, wenn der Server durch 100% CPU oder Speicherauslastung nicht reagiert.

Ich habe diesen Fehler, wenn ich aufgrund der Vollspeicherauslastung zuzugreifen versuchte Sonarqube API und der Server wurde nicht

reagiert
1

Ich hatte dieses Problem gehabt haben. Herausgefunden hatte ich eine andere Anwendung, die denselben Port (3000) verwendet.

einfache Möglichkeit, dies herauszufinden:

Im Terminal, Typ netstat -a -p TCP -n | grep 3000 (passen Sie den Port Sie für die '3000' verwendet wird). Wenn es mehr als ein Listening gibt, belegt bereits etwas anderes diesen Port. Sie sollten diesen Prozess stoppen oder den Port für Ihren neuen Prozess ändern.

0

Ein weiterer häufiger Grund für eine leere Antwort ist Timeout. Überprüfen Sie alle Hops, von denen der Cron-Job ausgeführt wird, auf Ihren PHP/Zielserver. Es ist wahrscheinlich ein Gerät/Server/Nginx/LB/Proxy irgendwo entlang der Linie, die die Anfrage früher als erwartet beendet, was zu einer leeren Antwort führt.