2016-03-15 1 views
0

J'essaie de faire mon tout premier test de régression de site. Le backend du site est constitué de plusieurs scripts PHP. J'ai donc appelé tous les fichiers PHP, les uns après les autres, en utilisant cURL, avec diverses entrées valides et invalides et vérifier le résultat. Tout fonctionne bien jusqu'à ce que j'atteigne la gestion d'authentification basée sur la session. Je vois qu'avec cURL le _SESSION ne fonctionne pas de la même manière qu'avec les appels normaux à PHP du navigateur (voir ci-dessous). Si je comprends bien, c'est parce que la fonctionnalité de la session nécessite un cookie du côté client, ce qui est manquant en cas d'utilisation de cURL comme je le fais (j'espérais que cela arriverait automagiquement). Comment puis-je faire en sorte que cURL prenne soin des cookies et appelle les fichiers php comme s'ils étaient appelés par un navigateur?Test de site PHP avec cURL et _SESSION

Dans l'exemple ci-dessous, je m'attends à voir "test" mais je vois "SESSION non défini" à la place.

fichier Appeler:

<?php 
session_start(); 
$_SESSION["test"] = "test"; 
echo sendPost('https://rodichi.net/sandbox/php/test_curl_session_called.php', null); 

function sendPost($url, $data) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $result = curl_exec($ch); 
    if ($result === false) { 
     die(curl_error($ch)); 
    } 
    curl_close($ch); 
    return $result; 
} 

fichier appelé:

<?php 
session_start(); 
if (isset($_SESSION['test'])) { 
    echo($_SESSION['test'].'<br>'); 
} else { 
    echo 'SESSION not set<br>'; 
} 

Répondre

1

cURL traitera de manière transparente les cookies pour vous, mais pour qu'ils persistent, soit ils doivent être sauvegardées un fichier, ou vous devez réutiliser le même handle cURL sur les demandes suivantes pour que les cookies soient envoyés.

Vous pouvez activer la gestion des cookies en appelant:

curl_setopt($ch, CURLOPT_COOKIEFILE, ''); // enable cookie handling 

Vous souhaitez alors faire une demande comme:

curl_setopt($ch, CURLOPT_URL, 'http://some_url_that_sets_cookies'); 
$result = curl_exec($ch); 

// without calling curl_close or destructing $ch 

curl_setopt($ch, CURLOPT_URL, 'http://another_url_that_uses_cookies'); 
$result = curl_exec($ch); // cookies from the previous request will be sent 

cURL ne fait rien avec le $_SESSION global qui associe un client une session spécifique utilisant l'ID de session dans le cookie afin que votre exemple de code définissant $_SESSION['test'], puis en utilisant cURL ne fonctionnera pas comme prévu.

Si vous souhaitez enregistrer les cookies dans un fichier après cURL est fermé, puis les restaurer plus tard, vous pouvez utiliser:

curl_setopt($ch, CURLOPT_COOKIEFILE, './cookies.txt'); // load cookies from here 
curl_setopt($ch, CURLOPT_COOKIEJAR', './cookies.txt'); // save cookies here when curl closes 

espoir qui aide.

+0

C'est clair, merci. Encore une question: Si la vérification de l'authentification dans la fonction appelée dépend du contenu de '_SESSION' (je vérifie par exemple' $ _SESSION ['expires'] ', je dois lire le cookie de session du fichier écrit par cURL et paramétrer la session Est-il possible de le faire avec les utilitaires cURL ou devrais-je le faire manuellement (puis-je restaurer un contenu de session en connaissant son identifiant)? – texnic

+0

Je ne suis pas vraiment sûr de ce que vous demandez. envoie le cookie de session approprié, PHP démarre la session sur le serveur distant Votre client de test pour cURL n'aura aucune relation avec $ _SESSION, et ne devrait pas vraiment le faire – drew010

+0

Désolé, je viens de réaliser moi-même l'unicité, était sur le point de supprimer le commentaire vous étiez plus rapide :) – texnic