php session_start() 在函数之间的 heroku 上不起作用

php session_start() not working on heroku between functions

首先我应该说我对部署应用程序不是很熟悉。我的大部分 Web 开发都是通过一个框架为我处理所有事情,或者是在本地完成的。现在我正在尝试部署个人项目,但遇到了问题。

我在 Heroku 上部署了一个 PHP 网站。我一直在使用 sessions 遇到一个又一个问题(一切都在本地完美运行,但在 Heroku 上中断)。通过浏览大约一百万个其他帖子,我已经解决了大部分问题。我正在使用 Memcachier,我确保有一个图标,我在每次 header("location: ... ") 调用后检查并添加了 "exit();",等等

最后,我 session 的工作几乎完美,除了一页。我在这个页面上有以下代码:

<?php

include('header.php');
include('functions.php');

//if id is set, flag as help needed
if(isset($_GET['id'])) {
    flagHelped($_GET['id'], 1);
}

//if cancel is set, unflag as help needed
if(isset($_GET['cancel'])){
    flagHelped($_GET['cancel'], 0);
}

//start the session and store userID in variables.
session_start();
$userID = $_SESSION['user_id'];

//grab all pets attached to this user.
$pets = getPets($userID);
?>

<!-- create table of pets -->
<div class='container bg-white'>
<table class='table'>
    <tr><th>Picture</th><th>Pet Type</th><th>Pet Name</th><th>Zip Code</th><th> Profile </th></tr>
    <?php
    if($pets != null){
        foreach($pets as $pet){
            echo "<tr>";
            echo "<td><img style='width:150px' src=\"".$pet["pictureLink"]."\"></td>";
            echo "<td>".$pet["type"]."</td>";
            echo "<td>".$pet["name"]."</td>";
            echo "<td>".$pet["zipCode"]."</td>";
            if($pet["needsHelp"] == 0){
                echo "<td><a href=\"help.php?id=".$pet["petId"]."\"><button class = 'btn btn-success'>Request An Angel</button></a></td>";
            }
            else{
                echo "<td><a href=\"help.php?cancel=".$pet["petId"]."\"><button class = 'btn btn-danger'>Cancel Request</button></a></td>"; 
            }
            echo "</tr>";
        }
    }
?>
</table>

<?php
    include('footer.php');
?>

flagHelped() 看起来像这样:

function flagHelped($petId, $status){
    echo "in flag helped";
    $connection = new mysqli(//credentials here);
    $connection->query("UPDATE Pets Set `needsHelp`=".$status." where `petId`=".$petId.";");
    $connection->close();
    return;
}

这是一个非常简单的页面,打印与登录用户关联的宠物列表,并打印一个按钮,该按钮重定向回当前页面作为带有 URL 变量的获取请求。

第一次加载页面(没有 URL 变量),没有问题。单击按钮后,它会调用 flagHelped() 方法,一直通过,正确保存到数据库和 returns。但是,session_start() 似乎对 return 没有做任何事情,而且它永远不会到达 getPets();

我几乎到处都放置了调试打印语句,并且以不同的方式对页面进行了重新排序。如果我在调用 flagHelped() 之前设置 session,我能够打印 $userID 变量,但是一旦我从该函数(在 functions.php 中)return,$userID 是不再有效。因为我不需要该函数的任何 session 变量,所以我决定在 returned 之后调用 session 变量。但即使这样也行不通。

再次抱歉,如果我在这里问了一个愚蠢的问题,我已经问了好几个小时了,我已经无计可施了。

旁注:我知道此页面可能存在安全风险。这是我在黑客马拉松中用不到 16 小时构建的应用程序,因此我不担心安全风险。我故意把我在代码 turn-in 时间之前走了多远。数据库中充满了虚假数据,我有一个免责声明 link 说不要使用真实信息,因为存在潜在风险。

编辑:添加图片:

First time going through page (no URL variable) with echo statements

Second time going thorugh page (with URL variable) with echo statements

好的,所以我终于弄明白了。我 post 在这里,以防其他人遇到这个问题并遇到我的 post。

这在本地有效,在 heroku 上无效,我不明白为什么。事实证明这是因为我试图将图像本地存储在 heroku 的服务器上。当我将它们本地存储在我自己的项目中时,它们将保留在我保存它们的文件夹中。当我将它们本地存储在 heroku 上时(如果用户在部署时在 heroku url 上上传了一张图片),一旦我的应用程序在 30 分钟不活动后休眠,它就会删除该图片。

发生的事情是我的项目找不到该图像,并且由于某种原因导致会话失效。在本地,一切正常(即使无法找到图像),它只是在部署到 heroku 上后才停止工作。我从数据库中手动删除了这些记录,该页面再次正常运行。

(现在我正在研究项目的 heroku 存储选项,以帮助永久解决问题。)