Préambule
Je fais cette note technique car je me suis plus d’une fois confronté à différentes configurations pour accéder à une page Web à partir de PHP. Normalement un serveur Web dispose d’une connection directe à internet et n’a pas besoin d’un proxy pour y acceder. Mais si on fait des script PHP en CLI (non liès à un serveur Web) on peut se trouver confronter à différents problèmes…
Cas 1 : la simplicité même
Voici le cas le plus simple pour récupérer un page à partir de son URL. Dnas le cas où PHP dispose d’un accès direct à internet.
HTTP
$content = file_get_contents("http://www.google.com/"); |
HTTPS
$content = file_get_contents("https://www.google.com/"); |
Si il vous manque l’extension open_ssl vous aurez une erreur dans ce genre :
Notice: file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP? in ...\test_001.php on line 3 Warning: file_get_contents(https://www.google.com/): failed to open stream: Invalid argument in ...\test_001.php on line 3
C’est aussi valable pour les cas suivants.
Cas 2 : Authentification HTML
Si la page est protégée par un mot de passe, PHP peut transformer une URL avec utilisateur et mot de passe pour envoyer la requête avec les bons headers.
HTTP
$content = file_get_contents("http://user:pass@www.example.com/"); |
HTTPS
$content = file_get_contents("https://user:pass@www.example.com/"); |
Méthode alternative
Vous pouvez aussi envoyer vous même les headers contenant mots de passe et utilisateur. C’est plus compliqué mais ça marche aussi.
// URL des données à récupérer $url = 'http://protectedstuff.com'; // Encodage de l'autentification $auth = base64_encode('user:password'); // Création des options de la requête $opts = array( 'http' => array ( 'method'=>'GET', 'header'=>"Authorization: Basic $auth" ), 'https' => array ( 'method'=>'GET', 'header'=>"Authorization: Basic $auth" ) ); // Création du contexte de transaction $ctx = stream_context_create($opts); // Récupération des données file_get_contents($url,false,$ctx); |
Source : http://fr.php.net/manual/fr/function.stream-context-create.php#74431
Cas 3 : En passant par un proxy
Il m’est arrivé d’écrire des script en PHP-CLI qui se retrouvaient bloqués par un proxy.
HTTP ou HTTPS
// URL des données à récupérer $url = 'https://www.google.com/'; // Création des options de la requête $opts = array( 'http' => array ( 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true ), 'https' => array ( 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true ) ); // Création du contexte de transaction $ctx = stream_context_create($opts); // Récupération des données $content = file_get_contents($url,false,$ctx); |
Cas 4 : Proxy et page avec authentification HTML
Si en plus la page que vous souhaitez télécharger requière une authentification, cela reste simple.
HTTP ou HTTPS
// URL des données à récupérer $url = 'https://user:pass@www.example.com/'; // Création des options de la requête $opts = array( 'http' => array ( 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true ), 'https' => array ( 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true ) ); // Création du contexte de transaction $ctx = stream_context_create($opts); // Récupération des données $content = file_get_contents($url,false,$ctx); |
Cas 5 : Proxy avec authentification
Dans certaines entreprises ou administration on peut se trouver derrière un proxy qui filtre les utilisateurs. Voici comment faire passer son script.
HTTP ou HTTPS
// URL des données à récupérer $url = 'http://www.example.com/'; // Encodage de l'autentification $authProxy = base64_encode('user:pass'); // Création des options de la requête $opts = array( 'http' => array ( 'method'=>'GET', 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true, 'header'=>"Proxy-Authorization: Basic $authProxy" ), 'https' => array ( 'method'=>'GET', 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true, 'header'=>"Proxy-Authorization: Basic $authProxy" ) ); // Création du contexte de transaction $ctx = stream_context_create($opts); // Récupération des données $content = file_get_contents($url,false,$ctx); |
Cas 6 : Proxy avec authentification et page avec authentification
Voici un des cas les plus complexes lorqu’il est question de récupérer des données. J’ai rencontré ce problème lorsque j’ai fait un script pour récupérer mes logs chez OVH.
HTTP ou HTTPS
// URL des données à récupérer $url = 'https://user:pass@www.example.com/'; // Encodage de l'autentification $authProxy = base64_encode('user:pass'); // Création des options de la requête $opts = array( 'http' => array ( 'method'=>'GET', 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true, 'header'=>"Proxy-Authorization: Basic $authProxy" ), 'https' => array ( 'method'=>'GET', 'proxy'=>'tcp://192.168.0.99:3128', 'request_fulluri' => true, 'header'=>"Proxy-Authorization: Basic $authProxy" ) ); // Création du contexte de transaction $ctx = stream_context_create($opts); // Récupération des données $content = file_get_contents($url,false,$ctx); |
Conclusion
Les exemples présentés ne se limitent aux cas typique de récupération de pages distantes. Ces cas seront satisfaisant dans la plupart des cas. Si vous rencontrez un cas non décrit dans cet article vous trouverez peut être de l’aide ici. Et si vous avez toujours des problèmes vous pouvez me demander de l’aide dans les commentaires. 😉
Bonjour,
j’ai essayer votre code Proxy et page avec authentification HTML pour acceder à un site avec un mot de passe malheureusement il m’affiche toujours le meme message d’erreur : failed to open stream: No such file or directory’
merci pour votre aide
@ikoussan: je ne vois pas ce que ça peut être, je vous contacte par mail pour des infos complémentaires.
super post !
Bonjour,
Votre article m’a été d’une très grande utilité ! Mille mercis !
J’utilisais la fonction de cette façon :
$content = file_get_contents($url);
Et le tout fonctionnait très bien partout, sauf à un endroit où il y avait un serveur proxy avec authentification.
J’ai vu grâce aux messages d’erreurs que c’est toujours la requête HTTP qui plantait.
Je n’ai pas remarqué immédiatement mais j’ai vite mis le serveur proxy en cause.
Voilà. 😉
Bonjour,
Merci beaucoup pour cet article très complet et pourtant concis, qui m’a bien aidé aujourd’hui.
@+
Cet article est trés bien structuré, ça m’a permis de me débloquer dans mon travail, Merci beaucoup, vous m’avez fait gagner beaucoup de temps !
Bravo et merci pour cet article.
j’ai esseye votre script mais rien ne marche pouvez vous determinier la cause merci d’avance
non sans message d’erreur ou contexte, je ne peux rien faire. 😉
article trés interressant…
Je me demandais comment mettre en place un mécanisme d’identification de l’utilisateur, sans login, sans mot de passe un peu comme un SESSION_ID…
je pensais faire une premier appel et générer un ID, puis le stocker et gérer le time out…
y a t’il d’autres solutions ?
Merci pour ce formidable tuto…
merci,
mais pour moi ca marche pas
j’ai mis :
$authProxy = base64_encode(‘cnmssdsi\7135:Dupond7135’);
cnmssdsi\7135 c’est le domaine et l’utilisateur
Dupond7135 c’est le mot de passe
la syntaxe est-elle bonne?
merci
Je me répond à moi-même
ca marche;
il faut simplement penser quand c’est une URL qui nécessite le proxy ou pas
la commande reste file_get_contents($request)
Comment faire pour que ce soit automatique?
mettre dans un tableau ou fichier les adresses qui n’ont pas besoin de proxy, les sites autorisés
Excellent information with unique content and it is very useful to know about the information based on blogs.this is valuable information for learners.thanks
Tableau Online Training
merci infiniment pour ce tuto, très goooood