PHP 会话无法在同一页面中运行
PHP session not working in the same page
<?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 设置需要调整? 运行 亚马逊 Linux EC2
要开始调试 session,首先要查看的是错误日志。如果那里什么都没有,则通过显式抛出错误来检查其是否正常工作。
接下来您应该检查是否有任何带有 session_start() 的脚本在您的浏览器上放置了 cookie。如果不是,那么您可能在 PHP 脚本或 auto-prepend 文件中有一个 BOM 标记,这导致 headers 在您调用 session_start() 之前刷新.这也意味着您的错误记录已损坏 - 返回并修复第一步。
如果服务器在响应中丢弃 cookie,请检查该 cookie 是否在后续请求中发回。如果未发送,则 cookie 路径或浏览器配置有问题。
如果您的浏览器发回它收到的 cookie 而 session 中没有数据 - 那么您的 session 处理程序无法写入数据。默认的 session 处理程序将文件写入磁盘 - 但配置的路径必须存在并且必须是可写的。再说一次,您永远不要进入检查错误日志设置是否正确的阶段。
已解决
/var/lib/php/session
的会话文件夹没有足够的权限。因此没有会话文件被写入其中。这应该在我的页面上引发错误。但是我的 display_errors
标志在我的 php.ini
设置中设置为 off
。
首先,我通过在 PHP 脚本的顶部写入 [=18=] 来打开 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 会话开始正常工作
注意: 对 chmod 使用 777
并不是最佳做法,因为它会打开 directory/file 并具有完全权限全世界。选择实现您的结果所需的正确 chmod 开关。您可以使用 http://www.onlineconversion.com/html_chmod_calculator.htm 来为您的场景确定正确的 chmod 开关。我愿意就在这种情况下应该使用的正确 chmod 或 chown 设置发表评论
<?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 设置需要调整? 运行 亚马逊 Linux EC2
要开始调试 session,首先要查看的是错误日志。如果那里什么都没有,则通过显式抛出错误来检查其是否正常工作。
接下来您应该检查是否有任何带有 session_start() 的脚本在您的浏览器上放置了 cookie。如果不是,那么您可能在 PHP 脚本或 auto-prepend 文件中有一个 BOM 标记,这导致 headers 在您调用 session_start() 之前刷新.这也意味着您的错误记录已损坏 - 返回并修复第一步。
如果服务器在响应中丢弃 cookie,请检查该 cookie 是否在后续请求中发回。如果未发送,则 cookie 路径或浏览器配置有问题。
如果您的浏览器发回它收到的 cookie 而 session 中没有数据 - 那么您的 session 处理程序无法写入数据。默认的 session 处理程序将文件写入磁盘 - 但配置的路径必须存在并且必须是可写的。再说一次,您永远不要进入检查错误日志设置是否正确的阶段。
已解决
/var/lib/php/session
的会话文件夹没有足够的权限。因此没有会话文件被写入其中。这应该在我的页面上引发错误。但是我的 display_errors
标志在我的 php.ini
设置中设置为 off
。
首先,我通过在 PHP 脚本的顶部写入 [=18=] 来打开 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 会话开始正常工作
注意: 对 chmod 使用 777
并不是最佳做法,因为它会打开 directory/file 并具有完全权限全世界。选择实现您的结果所需的正确 chmod 开关。您可以使用 http://www.onlineconversion.com/html_chmod_calculator.htm 来为您的场景确定正确的 chmod 开关。我愿意就在这种情况下应该使用的正确 chmod 或 chown 设置发表评论