备注:我通过添加更多信息并删除我发现错误的先前句子来多次更新此答案。在最后一次编辑中,我完全重新编写了它,删除了错误的句子和对 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_handler 或session.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_handler,ini_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_handler 或session.serialize_handler 设置空值或无效值来禁用会话功能。
请注意,如果这些值中的任何一个无效,session_start() 会触发 PHP Warning。
但是,因为这两个设置都可以从任何地方修改(PHP_INI_ALL 表示 php.ini、httpd.conf、.htaccess,PHP 代码),它们也可以从 PHP 中设置回有效值代码,以这种方式取消任何禁用会话的努力。
显然没有办法强制禁用会话,除了在没有会话支持的情况下编译 PHP,如上所述。