我打电话给session_start()时如何解决Permission错误?
当我上传脚本到服务器时,我得到了这个错误
警告:未知:打开(/ tmp / sess_58f54ee6a828f04116c2ed97664497b2,O_RDWR)失败:权限被拒绝(13)
警告:未知:无法写入会话数据(文件)。 请确认session.save_path的当前设置在第0行的Unknown中是正确的(/ tmp)
当我打电话session_start();
尽pipe我将/ tmp文件夹的权限设置为777。
更改会话path,您可以在其中写入数据或联系服务器pipe理员了解/ tmp问题
你将需要改变你的session.save_path
php.ini指令
你可以使用session_save_path
来做到这一点
如果您有SSH访问权限,那么这里是如何更正权限和所有权
sudo chown -R NAME_OF_USER /tmp
用运行php的用户replaceNAME_OF_USER。 你可以通过简单地把这些行放在一个php文件中find它:
$processUser = posix_getpwuid(posix_geteuid()); print $processUser['name']; exit;
此外,你可能想要使用ini_set('session.save_path', '/dir/here');
假设你有访问这个function。 build议的其他方法是有效的。
我刚刚和我的一个PHP脚本有同样的问题,我就像是什么我打破了'因为它前一天完美,我从我自己的本地Puppy Linux机器运行它,所以它甚至不是一个主机或任何东西。
我之前做的唯一一件事就是试图让Java在Web浏览器中工作,所以一些我如何设法让Java工作,但打破了PHP – 哎呀!
无论如何,我确实记得,虽然试图让Java工作,我已经删除了/ tmp文件夹的内容来清除可能导致问题的任何东西(实际上与Java结果是我使用旧的插件oij与新的Firefox )
为了解决这个问题,我打开了Rox文件pipe理器,去到/文件夹,然后右键单击tmp folder -> Mount Point 'tmp' and clicked properties
。
我注意到权限设置为所有者 – 读,写,执行,但组和世界只设置在读和执行,而不是写。 我为Group和World写了个勾号,现在PHP再次正常工作。
我不知道在什么时候tmp的权限必须改变,但是为了使用它们,PHP必须设置为具有写权限。
检查您是否遇到磁盘空间问题。 如果所有的权限是正确的(777应该为你做),那么如果没有足够的空间写入磁盘,你可能仍然会得到这个错误(对于某些版本的PHP和Apache)。
在以下情况下,我遇到了这个问题:
- 我用PHP填充了一些会话variables
- 虽然会议仍然活跃,我从主机上的PHP 5.4改为5.3。
- 重新加载页面给了错误,如上所述。
- 重新将PHP版本重新设置为5.4。
- 使用session_unset(); 和session_destroy(); 清理当前会话。
- 将PHP版本更改回5.3。
- 现在它再次运作。
结论:为了一个不相干的原因,我不得不改变我的PHP版本,并切换会话活着,会话被损坏。
我意识到这是一个旧post,但是我遇到了这个问题,并find了一个简单的解决scheme。
对我来说,这个问题发生在我的一个本地部署的网站上。 我还没有尝试访问使用其他浏览器的网站,但每当我尝试通过Chrome浏览器访问这个网站时都发生了这种情况。 我决定在应用程序选项卡下进入Chrome开发者工具,然后点击“清除存储”。 瞧 – 一切都像魔术一样。
希望这可以帮助别人!
添加以下行
ini_set('session.save_path', getcwd() . '/tmp');
之前
session_start();
如果:
- session.gc_probability> 0
- 会话文件是由不同的用户(例如root和apache)创build的。
- 会话文件都存储在同一个地方(例如/ var / lib / php / session)
然后当Apache PHP进程试图在会话文件上运行垃圾回收时,你会看到这个错误。
修复:
- 重新configurationPHP,使gc_probability为0,并有一个cron作业去除旧的/陈旧的文件。
- 让每个不同的用户将他们的会话文件保存在不同的地方(session_save_path()等)。
如果您使用的是Apache
Web服务器,则快速修复方法是转到命令行并input:
open /etc/apache2/
然后从打开的窗口中打开名为httpd.conf
的文件,并searchUser
或Group
将这两行更改为:
User _www Group _www
这是因为您希望您的服务器拥有系统目录的权限,尤其是您想要更改User
或者可以将您的Group
设置为staff
或admin
。
我有同样的权限问题,但在/ var / lib / php / session /中。
为了解决这个问题,我删除了这个文件并重新启动了php-fpm。
rm -rf /var/lib/php/session/sess_p930fh0ejjkeeiaes3l4395q96 sudo service php5.6-fpm restart
现在一切正常。
对我来说,这个问题似乎是一个WHM错误! 我有一堆添加域和所有工作正常,但与一个子域它会带来这个错误。
奇怪的事情,但如果我使用完整的URL与主域名,它工作正常:
main-domain.com/my.subdomain.com
如果我直接使用子域,会带来“Permission denied(13)”:
my.subdomain.com
东西是所有插件域根是:
/家庭/ XX /
但对于我的子域,不知道为什么,根是:(我不应该访问该目录)
/
所以它真的试图达到:/ tmp而不是/ home / xx / tmp
哪些也存在,但没有正确的权限
澄清这是整个path的例子:
/家/我的账户/的public_html
/家/我的账户/ tmp目录
/ tmp目录
我使用的解决方法是:
session_save_path( '/家庭/我的账户/ tmp目录');
在session_start();
由于nginx拥有/ tmp位置,并且由于www.conf,php-fpm在“apache”用户和组下运行,所以我最初遇到了这个问题。 我换出了该文件中的用户/组,然后工作正常。 你可能要检查<?php echo exec('whoami'); ?>
<?php echo exec('whoami'); ?>
来validation。
使用PHP 5.6我已经使用session_save_path()来指向域结构中的一个目录。 它工作得很好,直到我升级到PHP 7.0,那时我收到了指出的错误。 在PHP.net上,我发现了几个意见,指出直接path并不总是工作,所以我用他们的build议。
session_save_path(realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
完美的工作。 请记住将/../session
更改为实际会话目录的相对位置。