我遇到了一个与 PHP 会话保存路径相关的奇怪问题。我在 php.ini 中配置了 session.save_path = "/tmp",我知道这是正确配置的,因为我可以在服务器中输入以下命令,并且命令结果似乎没问题。
$ php -i | grep session.save_path
session.save_path => /tmp => /tmp
但是,当我尝试从 php 代码启动会话时,出现以下错误:
Warning: session_start(): open(/var/lib/php/session/sess_7ktfe84jqca3ga6ftk6fsrurv6, O_RDWR) failed: Permission denied (13)
所以这里的路径和php.ini中配置的/tmp完全不同。
这种行为有什么原因吗?我已经检查过,在我的代码中没有任何对 session_save_path 的调用来更改默认保存路径。
存在此问题的服务器是 AWS EC2 实例。
答案1
您还可以将其添加到您的 elastic beanstalk project.config 文件中:
“/etc/httpd/conf.d/php.conf”:内容:| php_value session.save_path“/tmp”
这将为你设置会话保存路径
答案2
我发现了这个问题,似乎是配置问题。我在服务器中打开了 phpinfo,看到以下内容:
Directive Local Value Master value
session.save_path /var/lib/php/session /tmp
指向 /var/lib/php/session 的本地值似乎是问题所在,因为服务器用户无法写入此目录。我对本地值和主值一无所知,在谷歌上搜索了一番后,我读到了以下内容:
可以使用 httpd.conf、.htaccess 或其他带有 php_value 指令的 Apache 配置中的“本地值”覆盖“主值”(来自 php.ini)。
因此,查看服务器文件后,我发现 /etc/httpd/conf.d/php.conf 包含:
#
Apache specific PHP configuration options
those can be override in each configured vhost
#
php_value session.save_handler "files"
php_value session.save_path "/var/lib/php/session"
所以问题就出在这里,这个 php.conf 覆盖了默认的 php.ini 配置。我可以用“#”注释掉最后一行,然后重启服务器,一切又恢复正常了。
希望这有帮助。
答案3
您还可以通过 ssh 连接(如果您最初已配置密钥/对)并更改文件夹的权限,使其归 webpp 用户所有
答案4
对此的快速解决方案是在 session_start() 之前放置以下内容;
<?php
$dir = sys_get_temp_dir();
session_save_path($dir);
?>