2017-06-13 11 views
0

Les variables de session PHP ne sont pas transférées entre les serveurs. Ceci est un exemple simple que j'utilise pour vérifier si cela fonctionne. S'il vous plaît, jetez un oeil.La session PHP ne fonctionne pas entre les serveurs

file1.php

<?php 
    session_start(); 

    $_SESSION['FirstName'] = Kshitij ; 
    $_SESSION['LastName'] = Kawatra ; 
    echo session_id(); 
    echo "<p>First Name is: " . $_SESSION['FirstName'] . "</p>" ; 
    echo "<p>Last Name is: " . $_SESSION['LastName'] . "</p>" ; 
?> 
<p>Go to the <a href="https://<server-ip>/file2.php">next page</a>.</p> 

file2.php (sur un autre serveur)

<?php 
    session_start(); 
    echo session_id(); 
    echo "<p>The FirstName session variable is: " . $_SESSION['FirstName'] . "</p>"; 
    echo "<p>The LastName session variable is: " . $_SESSION['LastName']. "</p> "; 
?> 

Même l'identifiant de session ne correspond pas.

+2

Comment avez-vous connecté les serveurs ensemble afin que les séances puissent travailler? Sont-ils derrière un équilibreur de charge ou sur des noms d'hôtes différents? Par défaut, les sessions ne peuvent en aucun cas se déplacer entre les serveurs. –

+0

ce que vous voulez utiliser la session dans ce cas ?? –

+0

@sami Les serveurs ont deux noms d'hôtes différents. Je veux stocker les variables de session dans une base de données, mais je ne suis pas sûr de la façon de récupérer les données de la base de données. – kkawatra

Répondre

2

Les sessions ne circulent pas entre les hôtes ou les serveurs par défaut. Si vous utilisez des cookies pour gérer des sessions, les cookies sont uniquement envoyés au serveur d'origine (version simplifiée). Si vous passez à un autre hôte/IP, le navigateur n'envoie naturellement pas de cookies d'un autre hôte à ce site. S'ils l'ont fait, tout le monde pourrait obtenir tous vos comptes et identifiants et en abuser.

Si vous souhaitez transférer des sessions entre des serveurs, vous devrez les connecter d'une manière ou d'une autre. Si elles sont complètement séparées, vous pouvez par exemple envoyer un jeton dans l'URL au deuxième serveur qu'il peut ensuite utiliser pour récupérer les informations nécessaires à partir du premier serveur. Le système que vous utiliseriez dépend de ce que vous essayez d'accomplir.

+0

Bien que ce soit une bonne option, je ne pense pas que ce soit très sécurisé. – kkawatra

+0

@kkawatra Il peut être sécurisé. C'est le nombre de systèmes d'authentification/SSO qui fonctionnent. Tout dépend de la façon dont vous gérez la génération de jetons et le transfert de données. –

+0

Pourriez-vous partager quelques exemples qui, selon vous, seront les plus efficaces et sécurisés? – kkawatra

2

tout d'abord ce n'est pas possible avec le comportement de la session par défaut http://php.net/manual/en/session.examples.basic.php

Vous pouvez utiliser un autre gestionnaire de session session_set_save_handler ou memcached

+0

Corrigez-moi si je me trompe. Si j'utilise le gestionnaire de session et enregistrez les données de session du serveur1 dans une base de données. Maintenant, si je souhaite récupérer ces données en utilisant le gestionnaire de session du serveur2, j'aurai besoin de l'identifiant de session ou de certaines données du serveur1 pour filtrer la requête. Si c'est le cas, je devrais transférer l'ID de session, entre les deux serveurs d'une autre façon, non? – kkawatra

+0

@kkawatra oui vous avez besoin du nom ou de l'identifiant de la session –

+0

Alors, à votre avis, quel serait le meilleur moyen de transférer le nom ou l'identifiant de la session? – kkawatra

2

Il existe des moyens de communication entre les serveurs, mais la session est pas. PHP Session est en fait un espace mémoire avec une durée de vie d'une session rafraichie de différentes manières possibles et cette mémoire est uniquement côté serveur et seul le serveur exécute le code PHP.

La meilleure façon, mais la plus difficile serait de créer un socket entre ces deux serveurs et de communiquer via des couches de sécurité entre ces deux serveurs.

http://php.net/manual/en/function.socket-create.php

La façon la plus facile serait de créer une API REST et communiquer à travers elle avec une sortie JSON provenant de la chaîne de requête html.

Returning JSON from a PHP Script