簡體   English   中英

GAE - PHP會話不起作用

[英]GAE - PHP sessions not working

我有一個使用Google App Engine托管的網絡應用程序,它使用PHP會話來檢查用戶是否已登錄等。

session_start()存在於所有腳本中,通過所有腳本中包含的config.php腳本。 該應用程序與Iframes一起使用,並且那些也接收session_start()調用。

在本地,它工作得非常好,但是在部署時,它就像$ _SESSIONS變量在用戶登錄后過期一樣。例如,有時當用戶提交登錄表單時,頁面會再次重定向到登錄(這是當用戶未登錄時,所有頁面的預期行為)。 這是一個隨機事件,有時它會起作用,有時它不會。

我嘗試使用session.cookie_lifetime=0更改php.ini並將session_start()放在腳本的最頂行。

這是config.php腳本(包含在所有腳本中):

<?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(作為示例):

<?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
    } 
?>

默認部署使用多個實例,並且會話似乎每個實例都以私有方式存儲。 如果您重新加載頁面幾次,您將看到有時存在會話,而在實例之間切換時則不會存在。

在標准環境中,GAE似乎用共享存儲設施替換會話存儲; 在靈活的環境中,它似乎並沒有這樣做。

您應該能夠將PHP配置為使用memcache存儲進行會話,但在flex中,您需要提供自己的memcache服務器。 文檔指出使用redislabs作為供應商,可以提供與GAE應用程序在同一數據中心內運行的內存緩存。 在你的php.ini中添加:

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

其中host:port來自redislabs為您提供的設置。 您也可以使用redis實例而不是memcache,但我沒有使用密碼。 我也沒有得到memcached會話來使用密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM