Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GAE-PHP会话不工作_Php_Google App Engine_Session_App Engine Flexible - Fatal编程技术网

GAE-PHP会话不工作

GAE-PHP会话不工作,php,google-app-engine,session,app-engine-flexible,Php,Google App Engine,Session,App Engine Flexible,我有一个使用Google app Engine托管的web应用程序,它使用PHP会话检查用户是否登录,等等 session\u start()通过包含在所有脚本中的config.php脚本出现在所有脚本中。应用程序与iFrame一起工作,这些iFrame还接收一个session\u start()调用 在本地,它工作得非常好,但在部署时,它的行为就像$\u会话变量在用户登录后很快过期一样。例如,有时当用户提交登录表单时,页面会再次重定向到登录(这是所有页面在用户未登录时的预期行为)。这是一个随机

我有一个使用Google app Engine托管的web应用程序,它使用PHP会话检查用户是否登录,等等

session\u start()
通过包含在所有脚本中的config.php脚本出现在所有脚本中。应用程序与iFrame一起工作,这些iFrame还接收一个
session\u start()
调用

在本地,它工作得非常好,但在部署时,它的行为就像$\u会话变量在用户登录后很快过期一样。例如,有时当用户提交登录表单时,页面会再次重定向到登录(这是所有页面在用户未登录时的预期行为)。这是一个随机事件,有时有效,有时无效

我尝试使用
session.cookie\u lifetime=0更改php.ini,并将session\u start()放在脚本的最上面一行

下面是config.php脚本(包含在所有脚本中):


默认部署使用多个实例,每个实例的会话似乎都是私有存储的。如果重新加载页面几次,在实例之间切换时,您将看到会话有时存在,有时不存在

在标准环境中,GAE似乎将会话存储替换为共享存储设施;在灵活的环境中,它似乎没有这样做

您应该能够将PHP配置为使用memcache存储进行会话,但在flex中,您需要提供自己的memcache服务器。这些文件指出,redislabs是一家供应商,可以提供与GAE应用程序运行在同一数据中心内的memcache。在php.ini中添加:

session.save_handler = memcached                                                               
session.save_path = "host:port"
其中
host:port
来自redislabs提供的设置。您也可以使用redis实例而不是memcache,但我还没有将其用于密码。我也没有让memcached会话使用密码

<?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
    } 
?>
session.save_handler = memcached                                                               
session.save_path = "host:port"