簡體   English   中英

谷歌應用引擎(php)的會話變量錯誤

[英]error with sessions variables at google app engine (php)

每次我將應用程序部署到谷歌應用程序引擎時,我都會遇到同樣的問題:在同一個 web 站點中從一個頁面轉到另一個頁面時,我的 session vars 消失了。 在我的本地主機上運行我的應用程序時我沒有這個問題,所以我相信這是因為錯誤的 GAE 配置(我是 GAE 的新手)。

我將在這里展示我的一個項目:

app.yaml:

runtime: php73

# Defaults to "serve index.php" and "serve public/index.php". Can be used to
# serve a custom PHP front controller (e.g. "serve backend/index.php") or to
# run a long-running PHP script as a worker process (e.g. "php worker.php").
#
# Serve your app through a front controller at index.php or public/index.php.
runtime_config:
  document_root: .

handlers:
# Serve images as static resources.
- url: /(.+\.(gif|png|jpg|css|js|map|PNG|svg))$
  static_files: \1
  upload: .+\.(gif|png|jpg|css|js|map|PNG|svg)$

- url: /.*
  script: auto

索引.php:

<?php
ini_set('allow_url_fopen',1);
switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
    case '/':
        require 'first.php';
        break;
    case '/first.php':
        require 'first.php';
        break;
    case '/first':
        require 'first.php';
        break;
    case '/second.php':
        require 'second.php';
        break;
        case '/second':
            require 'second.php';
            break;
    default:
        require 'first.php';
        break;
}
 ?>

首先.php:

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>fisrt</title>
  </head>
  <body>
    <h1>first</h1>
    <?php
      session_start();
      $_SESSION['id'] = 123;
      $_SESSION['nombre'] = 'franc';
     ?>
     <script>
        window.location.href="second.php";
     </script>
  </body>
</html>

第二.php:

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Second</title>
  </head>
  <body>
    <h1>Second</h1>
    <?php
      session_start();
      echo $_SESSION['id'];
      echo $_SESSION['nombre'];
     ?>
  </body>
</html>

在我的本地主機中,當我運行此項目時,它按預期工作:索引處的前 controller 重定向到 first.php。 first.php 創建會話變量並重定向到 second.php。 最后 second.php 打印來自會話變量的值。

但是,當我將相同的項目部署到 GAE 時,它顯示沒有 session 變量的 secon.php 頁面:在 GAE 的 second.php 的圖像

PD:我只是在沒有數據庫實例的谷歌應用引擎上部署項目。

我在本地和 GAE 中測試了您的文件,並看到了與您相同的結果,在本地工作,而不是 GAE 部署。 您的 yaml 文件很好,但您的 php 文件應在頂部包含session_start() ,在任何 htmlLine 甚至提到<!DOCTYPE html>之前

我找不到任何確切的官方文檔來說明為什么它應該放在首位,但社區眾所周知,最佳實踐要求它是這樣的,這個家伙分享了我無法在其他任何地方找到的更詳細的見解。

這是在應用程序后端發送的錯誤: ...session_start(): Cannot start session when headers already sent in... 要查看應用程序中的日志和事件,請查看日志瀏覽器的文檔 該工具可以幫助您識別諸如此類的錯誤和警告,以正確調試您的代碼。

以下是您通過正確使用session_start()發送的片段:

index.php

我做了一些調整並繼續在此處添加session_start() ,在 if 條件內確定 header 是否已發送或者 session id 是否為空

<?php
ini_set('allow_url_fopen',1);

if( !headers_sent() && '' == session_id() ) {
session_start();
}

switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
    case '/':
        require 'first.php';
        break;
    case '/first.php':
        require 'first.php';
        break;
    case '/first':
        require 'first.php';
        break;
    case '/second.php':
        require 'second.php';
        break;
        case '/second':
            require 'second.php';
            break;
    default:
        require 'first.php';
        break;
}
 ?>

一、php

<?php
session_start();
?>

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>fisrt</title>
  </head>
  <body>
    <h1>first 1</h1>
    <?php

      $_SESSION['id'] = 123;
      $_SESSION['nombre'] = 'franc';
     ?>
     <script>
        window.location.href="second.php";
     </script>
  </body>
</html>

二、php

<?php
session_start();
?>

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Second</title>
  </head>
  <body>
    <h1>Second 1</h1>
    <?php

      echo $_SESSION['id'];
      echo $_SESSION['nombre'];
     ?>
  </body>
</html>

使用這些文件,您應該能夠正確執行測試。 同樣,我建議您最終研究一個 PHP 框架,它可以幫助您處理每個文件的這些簡單問題。 是有關 PHP 框架的更多信息。

快樂編碼!

我相信session_start()應該出現在文件的頂部(在輸出任何數據之前),即嘗試將其放在<!DOCTYPE html>之前

暫無
暫無

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

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