PHP Derrière un Proxy

Note : Dans cet article quand je parle de proxy, c’est un serveur filtrant les entrées/sorties d’un réseau sur le web. Pour qu’une machine (serveur ou poste client) puisse accéder au web et surfer, il faut que le proxy soit correctement configuré pour que toutes les connexions réseaux passent par lui.

Ne nous le cachons pas, PHP hébergé derrière un proxy c’est juste la merde. Il n’est pas possible d’effectuer une configuration de manière unique pour que toutes les applications PHP passe par un proxy. Il faut donc prendre en compte dans son développement cette problématique.

Quelques exemple pour éclairer mes propos :
SoapClient, SoapServer, CURL prennent les configurations de connexion au proxy en paramètres.
Les fonctions de la famille file_get_contents, peuvent prendre en paramètres les configurations proxy, ou être configurées de manière globale grâce au système de stream context.
Et il y a les fonctions qui ne se configurent pas du tout comme exif_imagetype.

La question qui se pose, comment se faciliter la vie et arrêter de se prendre la tête avec ce p****n de PROXY de M***E ?

On inspire profondément, puis on expire.

Si vous utilisez Symfony2, il ne vous reste plus qu’a installer le superbement magnifiquement génialissime BehindAProxyBundle (Oui il est de moi ;) ) et lire la doc.

Dans le cas contraire vous pouvez utiliser le code du ProxyService.php.

Que fait la classe ProxyService ?

Elle centralise les options de configurations de connexion au proxy de différentes fonctions.
On y retrouve ce qu’il faut pour des connexions SOAP, CURL, ou stream context.

Qu’en est-il pour les fonctions qui ne peuvent pas être configuré comme exif_imagetype ?

La solution palliative à ce problème est de charger le fichier distant sur le serveur dans un fichier temporaire. (Genre le mec, il se la pète avec une phrase super longue qui ne veux rien dire…)

Le plus simple pour comprendre c’est de coder tout ça.

Dans notre cas nous coderons en dure le stream context sans passer par des classes externes.

function loadFileTemporarily($url) {

// Notre stream Context
$context = array(
                'http' => array(
                    'proxy' => 'tcp://172.0.0.1:8080',
                    'request_fulluri' => true,
                )
            );
$cxContext = stream_context_create($context);

$tmpfile = file_get_contents($file, false , $cxContext);

               // Ecriture du contenu récupéré dans un fichier temporaire
            $tempStreamFile = tmpfile();
            fwrite($tempStreamFile, $tmpfile);
            fseek($tempStreamFile, 0);

    // Récupération d’information par rapport à ce fichier temporaire
    $streamMetadData = stream_get_meta_data($tempStreamFile);

    // On retourne l’uri
            return $streamMetadData['uri'];
}

echo "<pre>";
print_r(
exif_imagetype(
loadFileTemporarily( "http://perdu.com//une-image.jpg" )
)
);
echo "</pre>";

J’utilise cette méthode dans un fork de ImageBundle de Gregwar.

Comment configurer le stream contex de manière globale ?

Pour les fonctions PHP qui utilisent le système de stream context, il est possible de définir les paramètres de manière globale.

Pour cela on utilise la fonction stream_context_set_default. Cette fonction doit être placé dans un fichier de configuration (au même niveau que la connexion à une base de données).

Ci-dessous un exemple d’implémentation.

// Dans un fichier de configuration

$context = array(
                'http' => array(
                    'proxy' => 'tcp://127.0.0.1:8080',
                    'request_fulluri' => true,
                )
            );

stream_context_set_default($context);
Publié dans PHP, Symfony2
Un commentaire pour “PHP Derrière un Proxy
1 Pings/Trackbacks pour "PHP Derrière un Proxy"

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*