[英]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()
發送的片段:
我做了一些調整並繼續在此處添加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
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
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.