【问题标题】:How to disable session in php?如何在php中禁用会话?
【发布时间】:2015-11-28 03:38:30
【问题描述】:

session_status 有一种可能的状态,称为 PHP_SESSION_DISABLED。

是否有任何特定的函数可以禁用 php 中的会话??

【问题讨论】:

  • @bub 谢谢你的回答,不幸的是它对我不起作用
  • 为什么要禁用会话?可能还有其他方法可以解决您的需求。
  • @RyanVincent :我想知道 session_status 如何与 PHP_SESSION_DISABLED 一起工作

标签: php session


【解决方案1】:

备注:我通过添加更多信息并删除我发现错误的先前句子来多次更新此答案。在最后一次编辑中,我完全重新编写了它,删除了错误的句子和对 PHP 源代码的引用。


Sessions 扩展的documentation 内容如下:

在 PHP 中默认启用会话支持。如果您不想在构建 PHP 时支持会话,则应指定 --disable-session 选项进行配置。

在使用 --disable-session 编译的 PHP 上调用 session_status() 或任何其他 session function 会触发 PHP 致命错误,该错误会停止脚本,因为该函数不存在:

$ php -m | grep session
$ php -r 'session_start();'
PHP Fatal error:  Call to undefined function session_start() in Command line code on line 1

文档还说:

Windows 版本的 PHP 已内置支持此扩展。您无需加载任何其他扩展即可使用这些功能。

这可能意味着无法从 Windows 上的 PHP 中删除会话功能。

如何在不重新编译 PHP 的情况下禁用会话

您可以通过在php.ini 中为session.save_handlersession.serialize_handler 设置空值或无效值来禁用会话功能。

对于测试,您可以设置session.save_handler,例如,在命令行中使用-d option;它会覆盖从php.ini 读取的值:

$ php -d session.save_handler=foo -r 'session_start(); var_dump(session_status() == PHP_SESSION_DISABLED);'
PHP Warning:  session_start(): Cannot find save handler 'foo' - session startup failed in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. session_start() Command line code:1
bool(true)

如您所见,session_start() 触发警告,抱怨处理程序无效,会话状态为 disabled(无法启动)。

无法通过 PHP 代码禁用会话

如果您尝试在运行时将无效值设置为 session.save_handlerini_set() 会触发警告并且不会更改值。

$ php -r 'ini_set("session.save_handler", "foo"); session_start(); var_dump(session_status() == PHP_SESSION_ACTIVE);'
PHP Warning:  ini_set(): Cannot find save handler 'foo' in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. ini_set() Command line code:1
bool(true)

会话是active。启动成功。

但如果在设置中禁用它们,则可以通过 PHP 代码重新启用它们

但是,即使处理程序在php.ini 或命令行中设置为无效,PHP 代码也可以在调用session_start() 之前对其进行修复:

$ php -d session.save_handler=foo -r 'ini_set("session.save_handler", "files"); session_start(); var_dump(session_status() == PHP_SESSION_ACTIVE);'
bool(true)

同样,session_start() 成功,会话为 active

结论

您可以通过在php.ini 中为session.save_handlersession.serialize_handler 设置空值或无效值来禁用会话功能。

请注意,如果这些值中的任何一个无效,session_start() 会触发 PHP Warning

但是,因为这两个设置都可以从任何地方修改(PHP_INI_ALL 表示 php.inihttpd.conf.htaccess,PHP 代码),它们也可以从 PHP 中设置回有效值代码,以这种方式取消任何禁用会话的努力。

显然没有办法强制禁用会话,除了在没有会话支持的情况下编译 PHP,如上所述。

【讨论】:

  • 只是想知道,如果我们调用session_start() 来启动会话,如果我们省略了它会禁用会话,这不是合乎逻辑的。另外,a2dismod session 呢?
  • @IndigoIdentity 不。如果你在session_start() 之前或session_destroy() 之后调用session_status(),它会返回PHP_SESSION_NONE (==1)。在它们之间,session_status() 返回PHP_SESSION_ACTIVE (==2)。如果session.auto_start1,那么PHP在初始化过程中调用session_start(),就不需要再调用了。虽然您可以启动和销毁会话,但这意味着它没有被禁用。
  • 谢谢你让我变得更聪明:)
  • @axiac:我不知道为什么 PHP 将 SESSION_DISABLED 设置为可能的状态之一,而且 php 文档中也没有此状态的示例!
  • @Parsamhn 我也不知道。看来this SO question 是该函数存在的原因。
【解决方案2】:

在咨询 PHP 源代码后,ext/session/tests/session_status_disabled.phpt 有以下文件:

--TEST--
Test session_status() function : disabled
--SKIPIF--
<?php include('skipif.inc'); ?>
--INI--
session.save_handler=non-existent
--FILE--
<?php

echo "*** Testing session_status() : disabled\n";

var_dump(session_status() == PHP_SESSION_DISABLED);

?>
--EXPECTF--
*** Testing session_status() : disabled
bool(true)

因此,当会话没有 save_handler 时,session_status() 将返回 PHP_SESSION_DISABLED

结论:

通过执行以下操作禁用会话:

在php.ini文件中修改这一行:

session.save_handler=non-existent

如果您正在运行一个 Web 服务器,它可能有自己的配置文件,它会覆盖 ini 文件。对我来说,在 Apache 中,我必须在 /etc/httpd/conf.d/php.conf 中注释掉以下几行:

#php_value session.save_handler "files"
#php_value session.save_path    "/var/lib/php/session"

或者在此处设置值。

【讨论】:

  • 我的 PHP 文件夹没有会话文件夹,但我使用 ini_set 函数将 session.save_handler 值更改为空值,但我遇到了错误:警告:ini_set(): 找不到保存处理程序'' ,不接受空值
  • 找到您的 php.ini 文件并将设置session.save_handler 的行更改为non-existent。它的默认值为files。当我这样做时,测试 php 文件成功了。 ini_set 命令在这种情况下不起作用。我不确定为什么,但可能是因为会话对象在运行您的任何代码时已经启动。
  • 正如 Axiac 所说:即使您为 session.save_handler 设置了空值或无效值,php 也会重新启用会话。
  • 不,不是空值。您需要将其设置为“不存在”
  • 为我工作。你确定你在正确的ini文件中设置它吗?
猜你喜欢
  • 2012-07-08
  • 2010-10-11
  • 2023-03-20
  • 1970-01-01
  • 2017-01-08
  • 2017-11-23
  • 2016-09-24
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多