【问题标题】:Location for session files in Apache/PHPApache/PHP 中会话文件的位置
【发布时间】:2011-06-23 02:34:03
【问题描述】:

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

【问题讨论】:

  • 只需使用<?php phpinfo() ?> 做一个页面并查找session.save_path
  • 通常 /tmp (IIRC) 但请检查您的 php.ini 中的 session.save_path

标签: php apache session


【解决方案1】:

默认 session.save_path 设置为"",它将评估为您系统的临时目录。请参阅https://bugs.php.net/bug.php?id=26757 的此评论说明:

在即将发布的版本(原文如此)中,save_path 的新默认值将是空字符串,这会导致临时目录被探测。

你可以使用sys_get_temp_dir to return the directory path used for temporary files

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

请参阅this answer,了解此函数返回空字符串时的临时路径。

【讨论】:

  • 然后从命令行执行 php -r 'echo session_save_path(), "\n";'
  • 在 Ubuntu 10.10 下该位置已设置,而不是“默认”。一个干净的 PHP 构建可能会给你这个,但不是在我使用的任何 Debian/Ubuntu 构建下。原始问题与 Ubuntu 10.10 有关。因此,只需根据最后一条评论(或我的答案)在命令行上查找它,因为位置可能与“默认”/空白/tmp 不同,具体取决于所使用的 Linux 发行版..
  • 警告!!我认为运行 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 是正确的,有两个php.ini 文件,php_info() 会告诉您当前评估期间正在使用哪个文件,locate php.ini 会帮助您找到它们
  • 请注意(根据最后 2 个 cmets):使用 CLI PHP 版本(命令行)可能会产生不同的结果,具体取决于发行版和编译。最主要的是它不是 Apache 版本。 (尽管 INI 文件可能与会话路径相同)。最好查看/grep 正确的 Apache PHP.INI。
【解决方案2】:

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

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

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

我认为如果你从源代码编译PHP,那么当session.save_path不设置时,会话文件将保存在/tmp中(虽然我自己没有测试过)。

【讨论】:

  • 我使用的是 Ubuntu 12.04.5 LTS,出于某种原因(我没有更改 php.ini 中的任何内容)我的会话位于 /var/lib/php5/sessions
  • “未设置”?它已设置 - 但在 php.ini 中已注释掉。这并不意味着它没有值或没有“设置”。从命令行只需执行:php -i | grep session.save_path 用于 CLI(可能还有 Apache)会话保存路径。此外,给定的php.ini 通常会显示“默认”路径 - 它只是被注释掉了。
  • 是的:如果没有编译为默认路径(大多数发行版不是这种情况),将使用空白(编译默认)。然后它将使用系统临时区域(通常为/tmp)作为其后备/默认值。请参考php.net/manual/en/…
  • @bshea,“未设置”,我的意思是设置为空字符串
  • DEFAULT Ubuntu 16.04 : /etc/php/7.0/*/php.ini -> ;session.save_path = "/var/lib/php/sessions" -- 评论并不意味着“未设置”只是我的意思。它显然设置为“空白”(/tmp)以外的其他内容。并且不是空/空字符串
【解决方案3】:

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

Ubuntu/Debian 旧/新 php.ini 位置:
带有 Apache 的旧 php5:/etc/php5/apache2/php.ini
带有 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”环境获取值(参见下面的 NOTE):

$ 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

注意:

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

编辑:根据@aesede 评论-> 添加php -i。谢谢

【讨论】:

  • 仅供参考,您可以在 CLI 中执行 php -i 以获得 phpinfo() 等效项。
【解决方案4】:

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

【讨论】:

  • 为什么 /var/lib/php5/ 永远不可写并且需要 chmodding/chowning。 PHP不应该设置默认可写的会话位置吗?
  • 我想在共享主机上是这样,其他人无法尝试劫持人们的会话。即,写入会话说“用户名:admin”并设置任意会话 ID,然后将 PHPSESSID 设置为该 ID。在共享主机环境中访问 Drupal 或 Wordpress 之类的东西非常容易。 (它只会让您以管理员帐户登录)
【解决方案5】:

我在 Mac 上查找会话的正确路径时遇到了同样的问题。总而言之,我发现 CLI PHP 的临时目录与 Apache 模块不同:Apache 使用 /var/tmp,而 CLI 使用类似 /var/folders/kf/hk_dyn7s2z9bh7y_j59cmb3m0000gn/T 的目录。但是两种方式,当session.save_path 为空时,sys_get_temp_dir() 让我找到了正确的道路。使用 PHP 5.5.4。

【讨论】:

    【解决方案6】:

    在使用带有 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
    

    【讨论】:

    • 供您参考:会话在 CLI 中不可用。因此,您将无法在 CLI 中使用与会话相关的函数和变量
    • @AhmadAsjad 这不是真的,虽然在 CLI 中使用会话没有任何意义,但所有方法仍然可用。会话保存路径可能不是在 CLI 模式下自动设置的,您仍然可以手动设置它,允许您访问现有会话数据。如果未设置路径,则默认恢复为系统临时文件夹,但仍可以创建新会话。
    • 手动,您可以更改任何默认行为:)
    【解决方案7】:

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

    【讨论】:

    • 虽然 PHP 文档说 "/tmp" 是默认值,但我尝试过的所有 linux 发行版都不会将会话文件放在 /tmp 中——你知道吗?如果您从源代码构建 PHP,是否会出现这种情况?当“session.save_path”为空时,很难弄清楚文件的去向(因此我怀疑这个问题)
    【解决方案8】:

    找到当前session.save_path 值的唯一可靠选项是始终在您想要找出会话存储目录的环境中检查phpinfo()

    原因:可以通过覆盖php.ini 值或在运行时使用ini_set('session.save_path','/path/to/folder'); 设置它来改变session.save_path 的各种事物。例如,ISPConfig、Plesk 等 Web 服务器管理面板通常会对此进行调整,为每个网站提供包含会话文件的自己的目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 2019-08-07
      相关资源
      最近更新 更多