如何在具有特定功能的php中禁用会话?

时间:2015-09-02 14:48:32

标签: php session

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

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

2 个答案:

答案 0 :(得分:3)

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

Sessions扩展程序的documentation显示为:

  

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

在使用session_status()编译的PHP上调用--disable-session或任何其他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设置空值或无效值来停用会话功能。

为了进行测试,您可以使用-d option在命令行中设置session.save_handler;它会覆盖从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之外,没有办法强制禁用会话,如上所述。

答案 1 :(得分:1)

在咨询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"

或者替代地设置值。