【问题标题】:PHP session not working in the same pagePHP会话不在同一页面中工作
【发布时间】:2015-01-28 19:28:41
【问题描述】:
<?php
    session_start();

    echo "BEFORE set::: " . $_SESSION['test'];         // should say 'Hello' AFTER page refresh
    echo "<pre>"; print_r($_SESSION); echo "</pre>";  // should show array AFTER page refresh

    $_SESSION['test'] = 'Hello';                       // setting session variable 'test'
    echo "<br />";

    echo "AFTER set::: " . $_SESSION['test'];          // says 'hello' at all times
    echo "<pre>"; print_r($_SESSION); echo "</pre>";  // shows array at all times

    echo "<br />";
    echo session_save_path();                         // echoed path should have session files in it

    phpinfo();                                        // shows php settings
?>

但是,无论我在没有设置“BEFORE set:::”值的情况下刷新了多少次页面,页面的输出始终是相同的

BEFORE set:::
Array
(
)

AFTER set::: Hello
Array
(
    [test] => Hello
)

/var/lib/php/session

ls /var/lib/php/session 也没有显示其中的文件。但是,在 chrome 中打开开发者控制台确实会始终为 cookie 键“PHPSESSID”显示相同的 cookie 值

我需要在我的机器上调整任何 PHP 设置吗?在 Amazon Linux EC2 上运行

【问题讨论】:

    标签: php session session-variables session-cookies


    【解决方案1】:

    要开始调试会话,首先要查看您的错误日志。如果那里什么都没有,则通过显式抛出错误来检查其是否正常工作。

    接下来,您应该检查是否有任何带有 session_start() 的脚本在您的浏览器上放置 cookie。如果不是,那么您可能在 PHP 脚本中有一个 BOM 标记或一个自动前置文件,这会导致在您调用 session_start() 之前刷新标题。这也意味着您的错误日志记录已损坏 - 返回并修复第一步。

    如果服务器在响应中丢弃了 cookie,请检查 cookie 是否在后续请求中发回。如果未发送,则 cookie 路径或浏览器配置有问题。

    如果您的浏览器正在发回它收到的 cookie 并且会话中没有数据 - 那么您的会话处理程序无法写入数据。默认会话处理程序将文件写入磁盘 - 但配置的路径必须存在并且必须是可写的。再一次,你永远不应该进入这个检查错误日志是否设置正确的阶段。

    【讨论】:

    • 您能告诉我在哪里可以找到位于 amazon Linux ec2 上的 apache/PHP 的错误日志吗?我会试试你的建议
    • 我应该打开display_errors 以更快地找出问题所在。感谢您提出错误问题
    【解决方案2】:

    解决了

    /var/lib/php/session 的会话文件夹没有足够的权限。因此没有会​​话文件被写入其中。这应该在我的页面上引发错误。但是我的display_errors 标志在我的php.ini 设置中设置为off。

    首先,我通过在我的 PHP 脚本顶部写入 ini_set('display_errors', '1'); 来打开 display_errors 而不触及机器的 php.ini 设置。然后错误开始显示在我的页面中。错误是:

    Warning: session_start(): open(/var/lib/php/session/sess_r3um5msmio61t3vbbl7bp313i2, O_RDWR) failed: 
    Permission denied (13) in /path/to/file/session.php on line 3
    Undefined index: test in /path/to/file/session.php on line 5
    

    因此,我去了会话文件文件夹并更改了文件夹权限。

    $> cd /var/lib/php
    $> ls ./session #should have shown PHP session files but not showing anything
    $> ls -l
    drwx------ 2 root root 12288 Jan 29 08:38 session
    $> chmod 777 session
    $> ls -l
    drwxrwxrwx 2 root root 12288 Jan 29 08:38 session
    $> service httpd restart
    $> ls ./session #now PHP session files should show up after a page refresh
    

    现在必要的会话文件正在写入/var/lib/php/session 的目录中,没有任何问题,PHP 会话开始正常工作


    注意: 将777 用于 chmod 并不是最佳做法,因为它会打开对整个世界具有完全权限的目录/文件。选择实现结果所需的正确 chmod 开关。您可以使用http://www.onlineconversion.com/html_chmod_calculator.htm 为您的方案确定正确的 chmod 开关。我愿意让 cmets 了解在这种情况下应该使用正确的 chmod 或 chown 设置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2011-08-16
      • 2012-02-13
      相关资源
      最近更新 更多