我打电话给session_start()时如何解决Permission错误?

当我上传脚本到服务器时,我得到了这个错误

警告:未知:打开(/ tmp / sess_58f54ee6a828f04116c2ed97664497b2,O_RDWR)失败:权限被拒绝(13)

警告:未知:无法写入会话数据(文件)。 请确认session.save_path的当前设置在第0行的Unknown中是正确的(/ tmp)

当我打电话session_start(); 尽pipe我将/ tmp文件夹的权限设置为777。

更改会话path,您可以在其中写入数据或联系服务器pipe理员了解/ tmp问题

http://php.net/manual/en/function.session-save-path.php

你将需要改变你的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)。

在以下情况下,我遇到了这个问题:

  1. 我用PHP填充了一些会话variables
  2. 虽然会议仍然活跃,我从主机上的PHP 5.4改为5.3。
  3. 重新加载页面给了错误,如上所述。
  4. 重新将PHP版本重新设置为5.4。
  5. 使用session_unset(); 和session_destroy(); 清理当前会话。
  6. 将PHP版本更改回5.3。
  7. 现在它再次运作。

结论:为了一个不相干的原因,我不得不改变我的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进程试图在会话文件上运行垃圾回收时,你会看到这个错误。

修复:

  1. 重新configurationPHP,使gc_probability为0,并有一个cron作业去除旧的/陈旧的文件。
  2. 让每个不同的用户将他们的会话文件保存在不同的地方(session_save_path()等)。

如果您使用的是Apache Web服务器,则快速修复方法是转到命令行并input:

 open /etc/apache2/ 

然后从打开的窗口中打开名为httpd.conf的文件,并searchUserGroup将这两行更改为:

 User _www Group _www 

这是因为您希望您的服务器拥有系统目录的权限,尤其是您想要更改User或者可以将您的Group设置为staffadmin

我有同样的权限问题,但在/ 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更改为实际会话目录的相对位置。