PHP Curl Et Cookies
J'ai un problème avec PHP Curl et les Cookies d'Authentification.
J'ai un fichier Connector.php qui authentifie les utilisateurs sur un autre serveur et renvoie le cookie avec l'utilisateur courant.
Le Problème est que je veux pour authentifier des milliers d'utilisateurs avec curl mais il authentifie et enregistre des COOKIES uniquement pour un seul utilisateur à la fois.
le code pour connector.php est-ce:
<?php
if(!count($_REQUEST)) {
die("No Access!");
}
//Core Url For Services
define ('ServiceCore', 'http://example.com/core/');
//Which Internal Service Should Be Called
$path = $_GET['service'];
//Service To Be Queried
$url = ServiceCore.$path;
//Open the Curl session
$session = curl_init($url);
//If it's a GET, put the GET data in the body
if ($_GET['service']) {
//Iterate Over GET Vars
$postvars = '';
foreach($_GET as $key=>$val) {
if($key!='service') {
$postvars.="$key=$val&";
}
}
curl_setopt ($session, CURLOPT_POST, true);
curl_setopt ($session, CURLOPT_POSTFIELDS, $postvars);
}
//Create And Save Cookies
$tmpfname = dirname(__FILE__).'/cookie.txt';
curl_setopt($session, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($session, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($session, CURLOPT_FOLLOWLOCATION, true);
//EXECUTE
$json = curl_exec($session);
echo $json;
curl_close($session);
?>
Ici est le processus d'authentification:
- Utilisateur entre un nom d'utilisateur et le mot de passe: Connecteur.le php?service=connexion&user_name=user32&user_pass=123
- Connecteur.le php?service=logosessionInfo cela renvoie des informations concernant l'utilisateur basée sur les cookies enregistrés plus tôt avec le service d'ouverture de session.
Le problème est que ce code Cookie enregistre dans un fichier pour un seul utilisateur et ne peut pas gérer plusieurs authentification de l'utilisateur.
- J'ai résolu mon problème avec la création de différents fichiers de cookies pour différents utilisateurs uniques PHPSESSID.
$tmpfname = dirname(__FILE__).'/'.$_COOKIE['PHPSESSID'].'.txt';
- est-ce une bonne idée si il ya beaucoup d'utilisateurs?
- Non Si vous avez de nombreux utilisateurs ce qui est mauvais. Il provoque des crash du serveur apache. - Je résoudre ce problème avec apache proxy. Et enlevé tout mon CURL code.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez spécifier le fichier de cookie avec un curl opt. Vous pouvez utiliser un fichier unique pour chaque utilisateur.
La meilleure façon de le gérer serait de coller votre demande de logique dans une boucle de la fonction et vient de passer le nom de fichier unique en tant que paramètre.
- Je l'utiliser pour rapidement gagner. Il prend l'url et un tableau d'options.
Dans le travail avec un problème similaire, j'ai créé la fonction suivante après la combinaison d'un grand nombre de ressources que j'ai rencontré sur le web, et en ajoutant mes propres la gestion des cookies. Espérons que cela est utile à quelqu'un d'autre.
#Set-Cookie:\\s+(?<cookie>[^=]+=[^;]+)#m
de votre code dans le ici et le moteur d'expressions régulières explique cette partie\\s+
comme:\` matches the character \ literally
s+` correspond au caractère s littéralement (sensible à la casse) -- n'est-il pas une erreur dans cette partie de regex, ne devrait-elle pas être\s+
(une seule barre oblique inverse) ?D'abord créer cookie temporaire à l'aide de tempnam() fonction:
De l'exécuter curl init sorcière cookie enregistre en tant que fichier temporaire:
Ou visiter les données de cookie où est stocker des données temporaires:
Ce sera des charges page de cookie initialisation:
Ici vous pouvez trouver des informations utiles sur l'cURL & cookies http://docstore.mik.ua/orelly/webprog/pcook/ch11_04.htm .
Vous pouvez également utiliser ce bien fait la méthode https://github.com/alixaxel/phunction/blob/master/phunction/Net.php#L89 comme une fonction:
Et la passer en
$cookie
paramètre:Vous pouvez définir différents cookies pour tous les utilisateurs avec
CURLOPT_COOKIEFILE
etCURLOPT_COOKIEJAR
. Faire fichier différent pour chaque utilisateur, afin que chacun aurait son propre cookie de session sur le serveur distant.Solutions qui sont décrits ci-dessus, même avec unique CookieFile noms, peut causer beaucoup de problèmes à grande échelle.
Nous avons dû servir beaucoup des authentifications avec cette solution et notre serveur est en baisse en raison de la forte fichier en lecture et en écriture actions.
La solution pour cela est d'utiliser Apache en Reverse Proxy et d'omettre CURL demandes à tous.
Détails comment utiliser un Proxy sur un serveur Apache peut être trouvé ici:
https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html