会话文件在Apache / PHP中的位置


81

在Ubuntu 10.10上安装Apache / PHP时,会话文件的默认位置是什么?


12
只需在页面上<?php phpinfo() ?>查找即可session.save_path
prodigitalson

1
通常是/ tmp(IIRC),但请检查您的php.ini中的session.save_path
Mark Ba​​ker,

Answers:


79

默认 session.save_path设置为"",这将评估你的系统的临时目录。请参阅https://bugs.php.net/bug.php?id=26757上的以下注释:

即将发布的版本(sic)中save_path的新默认值为空字符串,这将导致对临时目录进行探测。

您可以sys_get_temp_dir用来返回用于临时文件的目录路径

要查找当前会话的保存路径,可以使用

参考此答案以找出此函数返回空字符串时的临时路径。


68
然后从命令行执行php -r'echo session_save_path(),“ \ n”;'
理查德·阿约特

在Ubuntu 10.10下,该位置已设置,而不是“默认”。干净的PHP版本可能会为您提供此功能,但在我使用过的任何Debian / Ubuntu版本下都不行。orig问题与Ubuntu 10.10有关。因此,只需在最后一个注释(或我的回答)的命令行中查找它,因为位置可能会与'default'/ blank / tmp有所不同,具体取决于所使用的Linux发行版
。– bshea

4
警告!!我认为运行php -r'echo session_save_path(),“ \ n”;' 如上所述,将使用其他php.ini文件(也许是/etc/php/7.0/cli/php.ini而不是/etc/php/7.0/apache2/php.ini),因此可能具有不同的“ session.save_path”
Magmatic

@Magmatic是正确的,有两个php.ini文件,它们php_info()会告诉您当前评估中正在使用的是哪个文件,locate php.ini并将帮助您找到它们
Jonathan

请注意(最后2条评论):使用CLI PHP版本(命令行)会产生不同的结果,具体取决于发行版和编译。最主要的是它不是Apache版本。(尽管INI文件在会话路径上可能是相同的)。最好查看/ grep正确的Apache PHP.INI。
bshea

69

首先检查session.save_path使用ini_get('session.save_path')或的值phpinfo()。如果非空,则它将显示会话文件的保存位置。在许多情况下,默认情况下为空,在这种情况下,请继续阅读:

在Ubuntu或Debian机器上,如果session.save_path未设置,则将会话文件保存在中/var/lib/php5

在RHEL和CentOS系统上,如果session.save_path未设置,则会话文件将保存在/var/lib/php/session

我认为,如果您从源代码编译PHP,那么session.save_path未设置时,会话文件将保存在其中/tmp(尽管我自己尚未对此进行测试)。


1
我正在使用Ubuntu 12.04.5 LTS,并且由于某些原因(我没有更改任何内容php.ini),我的会话正在进行/var/lib/php5/sessions
Felipe

“没有设置”?它已设置-但在php.ini中已注释掉。这并不意味着它没有值或没有被“设置”。从命令行执行:php -i | grep session.save_path对于CLI(可能是Apache)会话保存路径。同样,给定php.ini通常会显示“默认”路径-只是将其注释掉。
bshea

是的:如果没有任何内容以默认路径编译(大多数发行版不是这种情况),将使用空格(默认编译)。然后它将使用系统临时区域(通常为/tmp)作为其后备/默认值。请参考php.net/manual/en/…–
bshea

@bshea,通过“未设置”,我的意思是设置为空字符串
Rich Rich

缺省Ubuntu 16.04:/etc/php/7.0/*/php.ini-> ;session.save_path = "/var/lib/php/sessions"-我的意思不是说“未设置”。显然它被设置为'blank'(/ tmp)以外的其他值,并且不是空/空字符串
bshea

16

如果不确定所编译的默认值session.save_path,请查看相关内容php.ini
通常,这将显示注释掉的默认值。

Ubuntu / Debian的旧/新php.ini位置:
使用Apache的/etc/php5/apache2/php.ini
较早php5:使用NGINX + FPM的较早php5:/etc/php5/fpm/php.ini
使用Apache的 Ubuntu 16+ :/etc/php/*/apache2/php.ini*
使用NGINX + FPM的Ubuntu 16+- /etc/php/*/fpm/php.ini*

* /*/=系统上安装的当前PHP版本。

要显示Apache下正在使用的PHP版本:

$ a2query -m | grep "php" | grep -Eo "[0-9]+\.[0-9]+"

7.3

由于PHP 7.3是此示例运行的版本,因此您可以将其用于php.ini

$ grep "session.save_path" /etc/php/7.3/apache2/php.ini

;session.save_path = "/var/lib/php/sessions"

或者,组合一线:

$ APACHEPHPVER=$(a2query -m | grep "php" | grep -Eo "[0-9]+\.[0-9]+") \ && grep ";session.save_path" /etc/php/${APACHEPHPVER}/apache2/php.ini

结果:

;session.save_path = "/var/lib/php/sessions"


或者,使用PHP本身在“ cli”环境中获取值(请参见下面的注释):

$ php -r 'echo session_save_path() . "\n";'
/var/lib/php/sessions
$

这些也将起作用:

php -i | grep session.save_path

php -r 'echo phpinfo();' | grep session.save_path

注意:

的“ cli”(命令行)版本php.ini 通常具有与Apache2 / FPM版本相同的默认值(至少与一样session.save_path)。您还可以使用类似的命令将Web服务器的当前PHP模块设置回显到网页,并使用wget / curl获取信息。关于这方面的使用,有很多帖子phpinfo()。但是,仅使用PHP接口或grep正确php.ini显示它的默认值会更快。

编辑:每个@aesede评论->添加了php -i。谢谢


7
仅供参考,您可以php -i在CLI中进行操作以获取phpinfo()等效项。
aesede 2015年

15

除了另一个常见的默认位置/tmp//var/lib/php5/


/ var / lib / php5 /永远不可写,并且需要chmodding / chowning。PHP不应设置默认情况下可写的会话位置吗?
CMCDragonkai 2014年

2
我认为在共享主机上其他人无法尝试劫持这些人的会话。即,在会话中写上“ username:admin”并设置一个任意会话ID,然后将PHPSESSID设置为该会话ID。在共享主机环境中访问诸如Drupal或Wordpress之类的东西将非常容易。(它只会以您的管理员帐户登录)
Mattisdada 2014年

4

为Mac上的会话找到正确的路径也遇到了同样的麻烦。总而言之,我发现CLI PHP的临时目录与Apache模块的临时目录不同:Apache使用了/var/tmp,而CLI使用了类似的东西/var/folders/kf/hk_dyn7s2z9bh7y_j59cmb3m0000gn/T。但是,这两种方式都为sys_get_temp_dir()我提供了session.save_path空路时的正确路径。使用PHP 5.5.4。


1

上面的这些都不适合我使用带有PHP 7.2的CentOS 7的IUS存储库:

php -v
> PHP 7.2.30 (cli) (built: Apr 19 2020 00:32:29) ( NTS )

php -r 'echo session_save_path(), "\n";
> 

php -r 'echo sys_get_temp_dir(), "\n";'
> /tmp

但是,会话不是保存在/tmp文件夹中,而是保存在文件/var/lib/php/mod_php/session/夹中:

ls /var/lib/php/mod_php/session/
> sess_3cebqoq314pcnc2jgqiu840h0k  sess_ck5dtaerol28fpctj6nutbn6fn  sess_i24lgt2v2l58op5kfmj1k6qb3h  sess_nek5q1alop8fkt84gliie91703
> sess_9ff74f4q5ihccnv6com2a8409t  sess_dvrt9fmfuolr8bqt9efdpcbj0d  sess_igdaksn26hm1s5nfvtjfb53pl7  sess_tgf5b7gkgno8kuvl966l9ce7nn

0

我相信它在/ tmp /中。但是,请检查您的phpinfo函数,它应该在某处显示session.save_path。


尽管PHP文档说默认是“ / tmp”,但我尝试过的所有Linux发行版都没有将会话文件放入其中/tmp-您知道这样做吗?如果从源代码构建PHP就是这种情况吗?如果“ session.save_path”为空,则很难弄清楚文件的位置(因此,我怀疑是这个问题)
2013年

0

查找当前session.save_path值的唯一surefire选项始终是phpinfo()在要查找会话存储目录的确切环境中进行检查。

原因:可能会发生各种变化session.save_path,通过覆盖php.ini值或在运行时使用进行设置ini_set('session.save_path','/path/to/folder');。例如,Web服务器管理面板(例如ISPConfig,Plesk等)经常对其进行调整,以使每个网站都有其自己的带有会话文件的目录。


-8

根据所运行服务器的类型,它可能有所不同。要找到目录,请在php.ini文件中搜索以下内容。

upload_tmp_dir =“ c:/ wamp / tmp”

该目录可以与您不同。


6
问题是会话文件,而不是上载文件
Rich
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.