2017-07-17 21 views
3

を働いていない私は、WebアプリはGoogle App Engineのを使用してホストされている必要があり、それはユーザーがログインしているかどうかを確認するためにPHPのセッションを使用するなどGAE - PHPのセッションが

session_start()が設定を通じて、すべてのスクリプトに存在していますそれらのすべてに含まれている.phpスクリプト。このアプリケーションはIframeで動作し、そのアプリケーションはsession_start()コールを受信します。

ローカルでは、非常にうまく動作しますが、展開すると、ユーザーがログインした後に$ _SESSIONS変数の期限が切れるように動作します。たとえば、ユーザーがログインフォームを送信すると、ページは再度ログインにリダイレクトされます。 (これは、ユーザーがログインしていないときのすべてのページで予想される動作です)。これはランダムなイベントです。時にはうまくいくこともありますが、時にはうまくいかないこともあります

session.cookie_lifetime=0でphp.iniを変更して、スクリプトの最上行にsession_start()を入れてみました。

ここで(すべてのスクリプトに含まれている)config.phpのスクリプトです:デフォルトの展開は、複数の使用

<?php 
    // vincular arquivos de configurações e classes 
    require_once($_SERVER['DOCUMENT_ROOT']. '/config.php'); 
    require_once($_SERVER['DOCUMENT_ROOT']. '/head.php'); 

    use orm\orm\TblUsuarioQuery As UsuarioQuery; 
    use orm\orm\TblGrupoQuery As GrupoQuery; 

    $redirect = isset($_GET['r']) ? $_GET['r'] : '/scope_home.php'; 

    // Checar se o login está correto 
    $errmsg = "Entre com seu usuário ou e-mail e senha:"; 
    if (isset($_POST['user']) && isset($_POST['pass'])) { 

     $user = filter_var($_POST['user'], FILTER_SANITIZE_STRING); 
     $pass = filter_var($_POST['pass'], FILTER_SANITIZE_STRING); 

     $q = new UsuarioQuery(); 
     if (strpos($user, '@') !== false) { 
      $usuario = $q->filterByEmail($user)->findOne();  
     } else { 
      $usuario = $q->filterByLogin($user)->findOne();  
     }    

     if ($usuario == null) { 
      $errmsg = "Usuário ou e-mail não existe. Verifique e tente novamente:"; 
     } else { 
      $q = new GrupoQuery(); 
      $grupo = $q->filterByTblUsuario($usuario)->findOne();  

      if (!password_verify($pass, $usuario->getSenha())) { 
        $errmsg = "Usuário ou senha incorretos. Verifique e tente novamente:"; 
      } else { 
       /* inicia a sessão */ 
       $_SESSION['username'] = $usuario->getLogin(); 
       $_SESSION['userid'] = $usuario->getCodUsuario();  
       $_SESSION['empresa'] = $grupo->getCodEmpresa(); 
      } 
     } 
    } 

    // Usuário logado? 
    if (isset($_SESSION['userid'])) { 
     // redireciona para o url solicitado 
     header('Location: http://'. ROOT_HOST . $redirect); // sim, redireciona 
    } 
?> 

答えて

0

:(例として)

<?php 
session_start(); 

$cur_page = $_SERVER["SCRIPT_NAME"]; 
if ((!isset($_SESSION['userid']) || $_SESSION['userid']=='') && $cur_page != '/login.php' 
    && $cur_page != '/redef-senha.php' && $cur_page != '/nova-senha.php') { 
    // página solicitada, caso seja diferente de scope_home, login, logout 
    // para garatir sincronia dos Iframes 
    $request = ($_SERVER['REQUEST_URI'] != '/login.php' 
      && $_SERVER['REQUEST_URI'] != '/scope_home.php' 
      && $_SERVER['REQUEST_URI'] != '/logout.php' 
      && $_SERVER['REQUEST_URI'] != '/') ? '?r='.$_SERVER['REQUEST_URI'] : ''; 

    header('Location: http://'. ROOT_HOST . '/login.php'.$request); // não, redireciona 
    die(); // pára execução do restante do script 
} 

そして、ここでは、login.phpですインスタンスは、インスタンスごとに個人的に格納されているようです。ページを数回リロードすると、セッションが時々存在し、インスタンス間を切り替えるときに別の時間が存在しないことがわかります。

標準的な環境では、GAEはセッションストアを共有ストレージファシリティに置き換えるようです。柔軟な環境ではそうは思われません。

セッションでMemcacheストレージを使用するようにPHPを設定できるはずですが、フレックスでは独自のmemcacheサーバを用意する必要があります。ドキュメントでは、ガイダンスアプリケーションと同じデータセンター内でmemcacheを実行できる仕入先としてredislabsを使用することを指しています。あなたのphp.iniに追加します:host:portはredislabs設定からである

session.save_handler = memcached                
session.save_path = "host:port" 

はあなたを与えます。また、memcacheの代わりにredisインスタンスを使用することもできますが、パスワードで作業する必要はありません。私はまた、パスワードで作業するためにmemcachedセッションも取得していません。