2009-12-17 6 views
34

J'ai une configuration de travail cron sur un serveur pour exécuter un script de sauvegarde en PHP hébergé sur un autre serveur. La commande que je l'ai utilisé est formaté comme ceci:Erreur Curl 52 Réponse vide du serveur

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

Ces derniers temps je reçois cette erreur lorsque le Cron fonctionne

curl: (52) Empty reply from server 

Je ne sais pas ce que cela signifie. Si je vais directement au lien dans mon navigateur, le script fonctionne bien et je reçois mon petit fichier zip de sauvegarde.

Quelqu'un peut-il fournir des informations à ce sujet?

+0

Cela n'a vraiment rien à voir avec PHP car curl ne se soucie pas de ce que le processeur de fichiers de sortie est. –

+1

Votre script de sauvegarde peut-il être exécuté si longtemps qu'il provoque l'expiration du 'curl'? Avez-vous essayé d'augmenter l'attente par défaut curl pour se connecter avec '--connect-timeout ' et pour toute l'opération à prendre avec '--max-time '? –

Répondre

31

Curl donne cette erreur lorsqu'il n'y a pas de réponse d'un serveur, puisque c'est une erreur pour HTTP de ne rien répondre à une requête.

Je suppose que le problème que vous avez est qu'il y a une partie de l'infrastructure réseau, comme un pare-feu ou un proxy, entre vous et l'hôte en question. Pour que cela fonctionne, vous devrez donc discuter du problème avec les personnes responsables de ce matériel.

+10

Il s'agit probablement de la mauvaise approche du dépannage. La réponse vide signifie qu'il était capable de se connecter à l'IP/port, mais le serveur n'a rien renvoyé dans la réponse. C'est probablement un problème sur le service lui-même. –

+1

Eh bien, pas tout à fait. Quand cela m'est arrivé, c'était parce que mon proxy d'authentification ne se connectait pas à l'hôte distant. Donc, en réalité, il n'y avait pas de problème sur le service lui-même. –

+0

Dans mon cas, j'ai un proxy, qui est désactivé pour l'interface de bouclage où le serveur est en cours d'exécution. – rbaleksandar

2

Dans mon cas, cela a été causé par un problème PHP APC. Le premier endroit à regarder serait les journaux d'erreurs Apache (si vous utilisez Apache).

Espérons que cela aide quelqu'un.

+0

Pouvez-vous expliquer un peu plus? Comment cela peut-il être causé par APC? Je ne suis même pas en cours d'exécution à l'intérieur de PHP, j'utilise simplement la ligne de commande. –

+0

C'était il y a si longtemps, je ne me souviens pas de la raison pour laquelle APC est la cause de ce problème. Désolé je ne peux pas aider. – Euperia

3

Dans mon cas c'était la redirection de serveur; curl -L a résolu mon problème.

1

Cela se produit lorsque vous essayez d'accéder à un site Web sécurisé tel que Https.

J'espère que vous avez manqué "de

Essayez de changer l'URL à cURL -sS "nom d'utilisateur: mot de passe" https://www.example.com/backup.php

+1

Beaucoup beaucoup. Et btw quoi de simple auth "nom d'utilisateur: mot de passe" a à voir avec https? –

0

Essayez this -> Au lieu de passer par cURL, essayez pinger le site que vous » Re essayant d'atteindre avec Telnet. La réponse que votre tentative de connexion renvoie sera exactement ce que cURL voit quand il essaye de se connecter (mais qu'il obscurcit inutilement de vous). Maintenant, en fonction de ce que vous voyez ici, vous pouvez tirer l'une des conclusions suivantes:

Vous tentez de vous connecter à un site Web qui est un hôte virtuel basé sur le nom, ce qui signifie qu'il ne peut pas être atteint via l'adresse IP. Quelque chose ne va pas avec le nom d'hôte - vous avez peut-être mal saisi quelque chose. Notez que l'utilisation de GET au lieu de POST pour les paramètres vous donnera une réponse plus concrète.

Le problème peut également être lié à l'en-tête 100-continue. Essayez d'exécuter curl_getinfo($ch, CURLINFO_HTTP_CODE) et vérifiez le résultat.

+0

Point intéressant. J'ai été en mesure d'obtenir le HTML en réponse avec 'telnet hostname' et' GET ' –

1

vous pouvez essayer cette boucle -sS « http://www.example.com/backup.php » en mettant votre URL dans « » qui a fonctionné pour moi, je ne connais pas la raison exacte, mais je suppose que mettre l'URL dans « » complète la demande au serveur ou termine simplement la demande d'en-tête.

13

Cela peut arriver si curl est invité à faire du HTTP sur un serveur HTTPS.

Exemple:

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

C'était la situation dans mon cas. 'curl localhost: 8443' m'a donné l'erreur de réponse vide. 'curl -k https: // localhost: 8443' a correctement servi la page. –

2

Il peut se produire lorsque le serveur ne répond pas en raison de 100% CPU ou de l'utilisation de la mémoire.

J'ai eu cette erreur lorsque je tentais d'accéder sonarqube API et le serveur ne réagissait pas en raison de l'utilisation de mémoire pleine

1

J'ai eu ce problème auparavant. J'ai trouvé une autre application utilisant le même port (3000).

moyen facile de trouver ceci:

Dans le terminal, le type netstat -a -p TCP -n | grep 3000 (remplacer le port que vous utilisez pour le '3000'). S'il y a plus d'une écoute, quelque chose d'autre occupe déjà ce port. Vous devriez arrêter ce processus ou changer le port pour votre nouveau processus.

0

Une autre raison courante pour une réponse vide est timeout. Vérifiez tous les sauts d'où le travail cron est en cours d'exécution à partir de votre serveur PHP/cible. Il y a probablement un périphérique/serveur/nginx/LB/proxy quelque part le long de la ligne qui termine la requête plus tôt que prévu, ce qui entraîne une réponse vide.

Questions connexes