J'ai un travail cron configuré sur un serveur pour exécuter un script de sauvegarde dans PHP hébergé sur un autre serveur. La commande que j'ai utilisée est formatée comme ceci:
curl -sS http://www.example.com/backup.php
Dernièrement, je reçois cette erreur lorsque le Cron tourne
curl: (52) Empty reply from server
Je n'ai aucune idée de ce que cela signifie. Si je vais au lien directement dans mon navigateur, le script s'exécute bien et j'obtiens mon petit fichier Zip de sauvegarde.
Quelqu'un peut-il fournir des informations à ce sujet?
Curl donne cette erreur lorsqu'il n'y a pas de réponse d'un serveur, puisqu'il s'agit d'une erreur pour HTTP de ne rien répondre à une demande.
Je soupçonne que le problème que vous avez est qu’il existe un élément d’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 en discuter avec les personnes responsables de ce matériel.
Cela peut arriver si on demande à curl de faire du HTTP simple sur un serveur qui utilise HTTPS.
Exemple:
$ curl http://google.com:443
curl: (52) Empty reply from server
Cela peut arriver lorsque le serveur ne répond pas en raison d'une utilisation à 100% du processeur ou de la mémoire.
J'ai eu cette erreur lorsque j'essayais d'accéder à l'API Sonarqube et le serveur ne répondait pas en raison de l'utilisation de la mémoire
Dans mon cas, cela était dû à un problème APC PHP. Le premier endroit à regarder serait les journaux d’erreurs Apache (si vous utilisez Apache).
J'espère que ça aide quelqu'un.
Dans mon cas, c'était la redirection du serveur; curl -L
a résolu mon problème.
Cela se produit lorsque vous essayez d'accéder à un site Web sécurisé tel que Https.
J'espère que tu as manqué
Essayez de changer l'URL en curl -sS -u "nom d'utilisateur: mot de passe" https://www.example.com/backup.php
Une autre raison courante pour une réponse vide est le délai d'attente. Vérifiez tous les sauts à partir desquels le travail cron est exécuté sur votre serveur PHP/cible. Il existe probablement un périphérique/serveur/nginx/LB/proxy quelque part sur la ligne qui termine la demande plus tôt que prévu, ce qui donne une réponse vide.
Dans le cas de connexions SSL, cela peut être dû à un problème dans les anciennes versions du serveur nginx qui segfault lors des requêtes curl et Safari. Ce bogue a été corrigé autour de la version 1.10 de nginx, mais il existe encore beaucoup d'anciennes versions de nginx sur Internet.
Pour les administrateurs nginx: l'ajout de ssl_session_cache shared:SSL:1m;
à un bloc http
devrait résoudre le problème.
Je sais que OP demandait un cas non-SSL, mais comme il s'agit de la page d'accueil principale du problème "Réponse vide du serveur", je laisse la réponse SSL ici, car j'étais l'un des nombreux frapper ma tête contre le mur avec ce problème.
J'ai eu ce problème avant. Compris, j'avais une autre application utilisant le même port (3000).
Un moyen facile de le savoir:
Dans le terminal, saisissez netstat -a -p TCP -n | grep 3000
(remplacez le port que vous utilisez par «3000»). S'il y a plus d'une écoute, quelque chose d'autre occupe déjà ce port. Vous devez arrêter ce processus ou changer le port de votre nouveau processus.
vous pouvez essayer ce curl -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 Supposons que la mise en "" de l'URL complète la requête adressée au serveur ou complète simplement la requête d'en-tête.
Dans mon cas (curl 7.47.0), c'est parce que j'ai défini l'en-tête content-length
sur la commande curl manuellement avec une valeur calculée par postman (j'ai utilisé postman pour générer des paramètres de commande curl et les copier dans Shell). Après avoir supprimé l'en-tête content-length
, cela fonctionne normalement.
Dans mon cas, j’utilisais uwsgi, j’ai ajouté la propriété http-timeout pendant plus de 60 secondes, mais cela ne fonctionnait pas à cause d’un espace supplémentaire et le fichier de configuration n’était pas chargé correctement.
Essayez this -> Au lieu de passer par CURL, essayez d’envoyer une requête ping au site que vous essayez d’atteindre avec Telnet. La réponse renvoyée par votre tentative de connexion correspondra exactement à ce que cURL verra lorsqu’il tentera de se connecter (mais qu’il dissimule inutilement auprès 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 un nom, ce qui signifie qu’il ne peut pas être atteint via une 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.