J'ai essayé de vous connecter à mon propre site en utilisant la fonction CURL et la fonction PHP File_Get_Contents () pour obtenir la source de ma page Web sans succès. J'exécute le script PHP sur le même serveur que j'essaie d'obtenir la source HTML. Curl ne renvoie aucune erreur, pas même lorsque vous utilisez Curl_Error () et la fonction PHP File_Get_Contents () renvoie ce qui suit:
AVERTISSEMENT: FILE_GET_CONTENTS ([[SITENNAME]) [Fonction.File-get-Contenu]: Échec de l'ouverture du flux: Connexion refusée dans [Chemin de fichier] sur la ligne 19. P> blockQuote>
Je ne sais pas pourquoi c'est. Pourquoi un serveur refuserait-il activement cette connexion? Comment puis-je l'arrêter? P>
Merci P>
EDIT: P>
Pour référence Voici mon code (CURL): P>
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.mydomain.co.uk'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_REFERER, ''); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: www.mydomain.co.uk')); $rawHTML = curl_exec($ch); $err = curl_error($ch); curl_close($ch); print $err; print 'HTML: ' . $rawHTML;
7 Réponses :
Regardez vos paramètres de pare-feu, ils peuvent être un peu trop stricts. Que se passe-t-il si vous vous connectez et
$ip = '127.0.0.1'; $fp = fsockopen($ip, 80, $errno, $errstr, 5); $result = ''; if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.exampl.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { $result .= fgets($fp, 128); } fclose($fp); }
+1 - Normalement localhost code> fonctionnerait, mais en utilisant souvent le nom du serveur ou la propriété intellectuelle. De nombreux pare-feu / routeurs ne permettront pas de demander des demandes essentiellement «en boucle» à travers le routeur.
J'ai bien peur de ne pas avoir d'accès telnet au serveur Web. Est-ce que là-bas, je peux imiter / tester cela à l'aide de commandes PHP?
Err. . Si vous êtes dans un environnement d'hébergement partagé, vous obtiendrez une réponse d'erreur, mais au moins vous savez que vous avez une connectivité. Donc, par exemple file_get_contents ("http://127.0.0.1/"); code>
Ok, tu as eu. Après votre suggestion, j'ai une page vierge. Aucun message d'erreur, pas de sortie, rien (la déclaration d'erreur est activée).
Vous n'obtenez donc aucune erreur de connexion cette fois-ci? pourrait être votre serveur Web pour le faire lorsqu'il n'est donné aucun nom d'hôte; Que se passe-t-il si vous y accédez à la maison, en utilisant l'adresse IP? I.E. Pointez votre navigateur à http://1.2.3.4/ code>
Désolé, gratter ça. Je reçois une réponse (je n'imprimais pas la sortie, Doh!), Mais ce n'est pas prometteur, tout ce qu'il dit est "Ce nom de domaine a été réservé à l'utilisation future". Je soupçonne que c'est le résultat de moi en utilisant l'hébergement partagé.
Oui, mais il nous dit que vous peut i> Connectez-vous à localhost code>. Donc, maintenant, le but est de se connecter à
localhost code> et d'envoyer des boucles ou PHP Envoyer la droite (un peu faux)
hôte: code> champ d'en-tête. Une solution serait d'utiliser un fichier
/ et hosts code>, mais je présume des chances que ce soit très mince, vous pourriez le faire (et en outre, cela peut être un peu risqué).
Merci de répondre. Oui, malheureusement, je n'ai pas accès au fichier / etc / hosts sur le serveur Web. Je pense que je pourrais juste avoir à accepter qu'il ne soit pas possible de le faire.
Voir ma réponse mise à jour. Si cela ne fonctionne pas, il y a encore plus de trucs; N'abandonnez pas, vous aurez beaucoup appris au moment de votre travail.
Toujours pas de chance, j'ai mis le code de boucle que j'utilise dans ma question initiale de référence. Tout ce que je reçois, c'est une page vierge.
vient d'ajouter un exemple de prise; Vous pouvez sauter des trucs préfabriqués et simplement vous connecter vous-même. Faites attention à la forme précise de la demande, car il est facile de casser!
Pas de chance, j'ai peur, toujours une sortie vierge. À court d'idées encore? ;)
Vous avez fait echo $ résultat; code>? aucune erreur que ce soit?
ERROR_REPORTATION (~ 0) CODE> En haut de votre fichier?
Ah j'en ai un de ces jours. Impression du résultat fait le tour! Merci beaucoup pour votre aide!
Existe-t-il des problèmes de codage de contenu que je devrais être au courant lorsque vous utilisez des sockets? Je reçois exactement la même sortie que je voudrais en visitant la page dans le navigateur mais JSON_Decode () ne fonctionne pas. Beirdly, il retourne la même valeur que je passe à elle.
Aucune question à laquelle je pense, vous obtenez les octets bruts de la prise, mais que fait i> incluent l'en-tête de réponse HTTP. Avez-vous coupé ça? Essayez Liste ($ Headers, $ corporelle) = exploser ("\ r \ n \ r \ n", $ résultat, 2); code>
Oui j'ai coupé les en-têtes. Hmm je ferai d'autres enquêtes demain. Merci encore pour votre aide.
Faites attention à un codage chunté BTW, cela donnera un bruit de bruit dans votre contenu s'il n'est pas manipulé correctement (certains numéros hexagonales courts, ne peuvent pas manquer)
Réussi à le réparer. Pour une raison quelconque, un groupe de caractères spéciaux était dans la chaîne, ce code dans les commentaires de la page PHP JSON_DECODE a fait l'astuce: Preg_replace ('/ [\ x00- \ x1f \ x80- \ xff] /' ',' ', $ JSON);
bien joué. Mais simplement supprimer des caractères de votre contribution n'est guère une solution; Vous devez examiner le problème de codage, en utilisant iconv code> ou
mb_convert_encoding code> pour tester et / ou convertir les codages (puis peut-être ouvrir une autre question ;-)
J'ai déjà eu ce problème lors de l'utilisation d'un serveur partagé avec une société d'hébergement, autant de fonctionnalités éteintes. Êtes-vous sur un serveur partagé / obtenez-vous votre hébergement gratuitement?
Vérifiez si Curl est également activé sur votre serveur dans votre configuration PHP. P>
$myFile = "testFile.txt"; $fh = fopen($myFile, 'r'); $theData = fread($fh, 5); fclose($fh); echo $theData;
Curl est activé car il fonctionne avec d'autres sites. Et en effet, j'utilise l'hébergement partagé que je suppose que c'est pourquoi cela ne fonctionne pas.
Oui, je semble me souvenir d'avoir le même problème sur mon hôte partagé. Je ne sais pas si vous l'avez déjà considéré, mais vous pouvez utiliser Fopen à la place? J'ai édité mon post ci-dessus.
A peur non, comme je suis après la sortie, pas le contenu.
HMM, la seule autre méthode que je peux voir consiste à utiliser un fichier PHP, puis appelez directement les fonctions directement. Je pense vraiment que vous avez besoin de courboire pour pouvoir faire ce que vous dites. La demande peut-être d'être allumée par votre fournisseur d'hébergement?
Hmm, je pourrais peut-être essayer y compris. Ce serait un peu un corps cependant. Merci pour votre aide quand même.
Pas de problème, désolé je ne pouvais pas aider davantage.
Peut-être une question stupide, mais vous n'avez pas de jeu de mots de passe .htaccess. Si votre navigateur le stocke, vous pouvez oublier, mais le serveur PHP ne l'a pas, mais il en aurait toujours besoin pour accéder au site. Presque certainement pas, mais peut-être la peine d'être suggéré. P>
Merci pour la suggestion, mais hélas non, je n'ai aucune protection par mot de passe sur l'URL racine.
La plupart éventuellement parce que votre site est dirigé vers une adresse IP publique, ce qui est mappé à une adresse IP interne comme MVDS pointée. P>
www.domain.com = 234.234.234.234 P>
IP du serveur: 10.0.0.1 P> blockQuote>
Cartes de pare-feu
234.234.234.234 -> 10.0.0.1 Code> des réseaux extérieurs, mais pas du trafic interne. P>
Par conséquent, vous devez vous connecter à votre machine avec l'adresse IP locale, ou localhost (
127.0.0.1 code>) mais maintienne toujours l'en-tête d'hôte (
www.domain.com code >). P>
Vos options sont: p>
Faites de votre configuration de votre fournisseur CORRECTEMENT ACHETE POUR LANDE EXTERNES IPS DANS LE PAREWALL. C'est faisable mais souvent manqué car il est rarement nécessaire. Un argument de travail pour que cela fonctionne est que vous ne pouvez pas accéder à d'autres sites qui résident sur le même segment de réseau que vous aujourd'hui. P> LI>
Dites à votre fournisseur d'ajouter www.domain.com ->
127.0.0.1 code> dans le fichier hosts sur votre serveur p> li>
Utilisez votre propre code-code pour "FAIN" L'en-tête d'hôte tout en vous connectant à localhost. Il y a beaucoup d'exemple de classes pour cela dans PHP et MVDS vous a déjà donné un exemple. P> LI>
trouver une autre façon d'aller chercher les informations. C'est sur le même serveur, n'est-ce pas? La récupération de HTTP semble redondante ... p> li> ol>
Merci pour l'explication détaillée et des conseils.
AD 4) Un piratage vraiment laid (mais efficace) doit définir € _ obtenir [...] = ... code> à quels paramètres dont vous avez besoin, puis
inclure code> un fichier.
Le problème total était d'ajouter cette ligne au fichier hôte (/ etc / hosts) grâce à Jishi! :) p> p>
Le moyen le plus simple de récupérer un fichier local est l'utilisation du chemin local.
file_get_contents('page.html');