正在设置php.ini's会话.Auto_start to 1被认为是不好的做法


Is setting php.ini's session.auto_start to 1 considered bad practice?

我正在玩php.ini的会话。Start_auto并尝试将其设置为1。我正在建设的网站需要在每一页的会话管理,无论如何,服务器只包含一个网站。这是否被认为是不好的做法(就像启用全局变量一样——我不这么认为!)——php.net对此并没有说太多。

不,为什么呢?原则上,这与将session_start();作为每页的第二行是一样的。

  • 如果人们部署你的应用程序没有控制php.ini(例如共享主机),那么依赖php.ini设置可能会很棘手。即使可以改变php.ini,由于php.ini配置问题而理解问题可能很难理解(您可能必须编写一个脚本,允许检查配置是否正确等)。

  • 作为替代方案,您可以创建一个唯一的"控制器"脚本(例如/index.php),它将根据发送给它的参数(例如yoursite.com/index.php?page=12或更好的yoursite.com/page/12与路由&URL重写)。在index.php文件中,为所有页面设置一次session_start()

说实话,我认为打开auto_session是不好的。就像其他人说的,这和在你所有的页面上放一个session_start()是一样的。

想象所有进入你网站主页的人。甚至在他们尝试登录或做其他事情之前,会话就会被创建。所有的垃圾邮件机器人,所有的搜索引擎机器人等都会在进入你的页面时创建一个会话。这通常是一件坏事,因为它会在你的服务器上创建大量的文件(如果会话是基于文件的)或填满你的ram缓存(如果会话是基于memcache的)。

只有当你真正需要一个会话时,才运行session_start()要好得多。你可以创建一个"会话类"或简单的函数,比如session_get()和session_put(),它们会为你运行session_start()。然后使用这些而不是直接使用$_SESSION

我会说答案是"是的,这是不好的做法"。

[免责声明:我从1997年开始构建网页——那时你所有的代码都是手工编写的,所以我开发了自己的做事方式。]

在我的世界里,我有一个MySessionHandler扩展SessionHandler。它拉入一个INI文件,其中包含所需的所有ini_set命令。我注意到我不是唯一一个这样做的人。如果您自动启动会话(在代码执行之前发生),那么许多框架也有问题。

我的PHP脚本中的第一行可执行代码是MySessionHandler.php的要求,它首先检查auto-start和use_strict_mode的值,如果它们没有正确设置,可以选择以错误结束。

由于您可以在只读模式下启动会话以获得更好的性能并避免会话文件锁定,因此我更倾向于手动启动会话