Fatal error: session_start(): Failed to initialize storage module: files问题解决方法


Posted in PHP onMay 04, 2014

之前编译安装的LNMP环境+phpmyamdin4.02的版本,今天突然出现这个问题:

Fatal error: session_start(): Failed to initialize storage module: files (path: ) in /data/www/phpmyadmin/libraries/session.inc.php on line 83

大致意思是session会话初始化的时候储存路径有误!第一反应就是查看php.ini的配置文件中的:
session.save_path = "/tmp"

默认前面是加的分号,表示不启用,我之前配置的时候已经启用了。那为什么还会报错呢?,于是网上找了一些资料,感觉都千篇一律:

1、检查error.log(Apache2.2\logs)文件,查看是否有错误报告。未发现。
2、检查php.ini中的session.save_handler的值是否为files,如果不是改为files
3、检查php.ini文件中session.save_path是否被注释了,如果有,则去掉前面的”;”。
4、将save_path后面的路径改成已有的路径,比如”D:\php\temp”
5、检查temp文件夹的属性是否可读可写。
6、重启APACHE服务器。OK

不知道那些哥们转载的时候自己试过了没有(在这里喷一下,最讨厌那种自己都没有亲测,就一股脑的转来转去。一点都不负责!)
根据上面的流程,排查了之后发现压根就没有解决,不过小编的服务器是nginx非apache。
然后自己写了一个脚本test.php:

$r = session_start(); 
var_dump($r);

打印结果为:
Warning: session_start(): SAFE MODE Restriction in effect. The script whose uid is 501 is not allowed to access /tmp owned by uid 0 in /data/www/test.php on line 3 Fatal error: session_start(): Failed to initialize storage module: files (path: ) in /data/www/test.php on line 3

意思是 php5一个安全模式的bug,默认session的save_path是系统的临时目录,这样会要校验权限。而这个脚本不能通过/tmp拥有者uid为0来执行uid是501也是www用户组的权限
解决这个有两种解决方法:

1.关闭安全模式;
2.在命令行下chown改文件/目录的拥有者

当然两种方法都要求你有服务器的权限。
下面是示例php.ini的配置文件:

[Session]
 ; Handler used to store/retrieve data.
 ; http://php.net/session.save-handler
session.save_handler = files; Argument passed to save_handler.  In the case of files, this is the path
 ; where data files are stored. Note: Windows users have to change this
 ; variable in order to use PHP's session functions. ; The path can be defined as:
 ;     session.save_path = "N;/path"
 ; where N is an integer.  Instead of storing all the session files in
 ; /path, what this will do is use subdirectories N-levels deep, and
 ; store the session data in those directories.  This is useful if you
 ; or your OS have problems with lots of files in one directory, and is
 ; a more efficient layout for servers that handle lots of sessions.
 ; NOTE 1: PHP will not create this directory structure automatically.
 ;         You can use the script in the ext/session dir for that purpose.
 ; NOTE 2: See the section on garbage collection below if you choose to
 ;         use subdirectories for session storage
 ; The file storage module creates files using mode 600 by default.
 ; You can change that by using
 ;     session.save_path = "N;MODE;/path"
 ; where MODE is the octal representation of the mode. Note that this
 ; does not overwrite the process's umask.
 ; http://php.net/session.save-path
 session.save_path = "/tmp"
; Whether to use cookies.
 ; http://php.net/session.use-cookies
 session.use_cookies = 1
; http://php.net/session.cookie-secure
 ;session.cookie_secure =
; This option forces PHP to fetch and use a cookie for storing and maintaining
 ; the session id. We encourage this operation as it's very helpful in combatting
 ; session hijacking when not specifying and managing your own session id. It is
 ; not the end all be all of session hijacking defense, but it's a good start.
 ; http://php.net/session.use-only-cookies
 session.use_only_cookies = 1
; Name of the session (used as cookie name).
 ; http://php.net/session.name
 session.name = PHPSESSID
; Initialize session on request startup.
 ; http://php.net/session.auto-start
 session.auto_start = 0
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
 ; http://php.net/session.cookie-lifetime
 session.cookie_lifetime = 0
; The path for which the cookie is valid.
 ; http://php.net/session.cookie-path
 session.cookie_path = /
; The domain for which the cookie is valid.
 ; http://php.net/session.cookie-domain
 session.cookie_domain =
; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript.
 ; http://php.net/session.cookie-httponly
 session.cookie_httponly =
; Handler used to serialize data.  php is the standard serializer of PHP.
 ; http://php.net/session.serialize-handler
 session.serialize_handler = php
; Defines the probability that the 'garbage collection' process is started
 ; on every session initialization. The probability is calculated by using
 ; gc_probability/gc_divisor. Where session.gc_probability is the numerator
 ; and gc_divisor is the denominator in the equation. Setting this value to 1
 ; when the session.gc_divisor value is 100 will give you approximately a 1% chance
 ; the gc will run on any give request.
 ; Default Value: 1
 ; Development Value: 1
 ; Production Value: 1
 ; http://php.net/session.gc-probability
 session.gc_probability = 1
; Defines the probability that the 'garbage collection' process is started on every
 ; session initialization. The probability is calculated by using the following equation:
 ; gc_probability/gc_divisor. Where session.gc_probability is the numerator and
 ; session.gc_divisor is the denominator in the equation. Setting this value to 1
 ; when the session.gc_divisor value is 100 will give you approximately a 1% chance
 ; the gc will run on any give request. Increasing this value to 1000 will give you
 ; a 0.1% chance the gc will run on any give request. For high volume production servers,
 ; this is a more efficient approach.
 ; Default Value: 100
 ; Development Value: 1000
 ; Production Value: 1000
 ; http://php.net/session.gc-divisor
 session.gc_divisor = 1000
; After this number of seconds, stored data will be seen as 'garbage' and
 ; cleaned up by the garbage collection process.
 ; http://php.net/session.gc-maxlifetime
 session.gc_maxlifetime = 1440
; NOTE: If you are using the subdirectory option for storing session files
 ;       (see session.save_path above), then garbage collection does *not*
 ;       happen automatically.  You will need to do your own garbage
 ;       collection through a shell script, cron entry, or some other method.
 ;       For example, the following script would is the equivalent of
 ;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
 ;          find /path/to/sessions -cmin +24 | xargs rm
; PHP 4.2 and less have an undocumented feature/bug that allows you to
 ; to initialize a session variable in the global scope, even when register_globals
 ; is disabled.  PHP 4.3 and later will warn you, if this feature is used.
 ; You can disable the feature and the warning separately. At this time,
 ; the warning is only displayed, if bug_compat_42 is enabled. This feature
 ; introduces some serious security problems if not handled correctly. It's
 ; recommended that you do not use this feature on production servers. But you
 ; should enable this on development servers and enable the warning as well. If you
 ; do not enable the feature on development servers, you won't be warned when it's
 ; used and debugging errors caused by this can be difficult to track down.
 ; Default Value: On
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/session.bug-compat-42
 session.bug_compat_42 = Off
; This setting controls whether or not you are warned by PHP when initializing a
 ; session value into the global space. session.bug_compat_42 must be enabled before
 ; these warnings can be issued by PHP. See the directive above for more information.
 ; Default Value: On
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/session.bug-compat-warn
 session.bug_compat_warn = Off
; Check HTTP Referer to invalidate externally stored URLs containing ids.
 ; HTTP_REFERER has to contain this substring for the session to be
 ; considered as valid.
 ; http://php.net/session.referer-check
 session.referer_check =
; How many bytes to read from the file.
 ; http://php.net/session.entropy-length
 session.entropy_length = 0
; Specified here to create the session id.
 ; http://php.net/session.entropy-file
 ; On systems that don't have /dev/urandom /dev/arandom can be used
 ; On windows, setting the entropy_length setting will activate the
 ; Windows random source (using the CryptoAPI)
 ;session.entropy_file = /dev/urandom
; Set to {nocache,private,public,} to determine HTTP caching aspects
 ; or leave this empty to avoid sending anti-caching headers.
 ; http://php.net/session.cache-limiter
 session.cache_limiter = nocache
; Document expires after n minutes.
 ; http://php.net/session.cache-expire
 session.cache_expire = 180
; trans sid support is disabled by default.
 ; Use of trans sid may risk your users security.
 ; Use this option with caution.
 ; - User may send URL contains active session ID
 ;   to other person via. email/irc/etc.
 ; - URL that contains active session ID may be stored
 ;   in publically accessible computer.
 ; - User may access your site with the same session ID
 ;   always using URL stored in browser's history or bookmarks.
 ; http://php.net/session.use-trans-sid
 session.use_trans_sid = 0
; Select a hash function for use in generating session ids.
 ; Possible Values
 ;   0  (MD5 128 bits)
 ;   1  (SHA-1 160 bits)
 ; This option may also be set to the name of any hash function supported by
 ; the hash extension. A list of available hashes is returned by the hash_algos()
 ; function.
 ; http://php.net/session.hash-function
 session.hash_function = 0
; Define how many bits are stored in each character when converting
 ; the binary hash data to something readable.
 ; Possible values:
 ;   4  (4 bits: 0-9, a-f)
 ;   5  (5 bits: 0-9, a-v)
 ;   6  (6 bits: 0-9, a-z, A-Z, "-", ",")
 ; Default Value: 4
 ; Development Value: 5
 ; Production Value: 5
 ; http://php.net/session.hash-bits-per-character
 session.hash_bits_per_character = 5
; The URL rewriter will look for URLs in a defined set of HTML tags.
 ; form/fieldset are special; if you include them here, the rewriter will
 ; add a hidden <input> field with the info which is otherwise appended
 ; to URLs.  If you want XHTML conformity, remove the form entry.
 ; Note that all valid entries require a "=", even if no value follows.
 ; Default Value: "a=href,area=href,frame=src,form=,fieldset="
 ; Development Value: "a=href,area=href,frame=src,input=src,form=fakeentry"
 ; Production Value: "a=href,area=href,frame=src,input=src,form=fakeentry"
 ; http://php.net/url-rewriter.tags
 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

因为这个是在一台VPS上面配置的,上面有多个项目,于是小编打开一个项目,发现此项目的验证码功能是OK的。
于是查看代码如下:

$sessSavePath = "/data/sessions/";
 // Session保存路径
 if(is_writeable($sessSavePath) && is_readable($sessSavePath)){ session_save_path($sessSavePath); }
 if(!empty($cfg_domain_cookie)) session_set_cookie_params(0,'/',$cfg_domain_cookie);

上面这个代码是在session_start() 初始化之前来判断是否存在session会话的文件夹。
于是就在phpmyadmin里面的保存的那个文件/phpmyadmin/libraries/session.inc.php做了下修改:

if (! isset($_COOKIE[$session_name])) {
 // on first start of session we check for errors
 // f.e. session dir cannot be accessed - session file not created
 $orig_error_count = $GLOBALS['error_handler']->countErrors();
 //session_save_path('./tmp');
 session_save_path("/data/www/session");
 $r = session_start();
 if ($r !== true
 || $orig_error_count != $GLOBALS['error_handler']->countErrors()
 ) {
 setcookie($session_name, '', 1);
 /*
 * Session initialization is done before selecting language, so we
 * can not use translations here.
 */
 PMA_fatalError('Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.');
 }
 unset($orig_error_count);
 } else {
 session_save_path("/data/www/session");
 session_start();
 }

在 session_start();  前面添加了  session_save_path(“/data/www/session”); 就解决了这个问题。
切记通过@ini_set(‘session.save_path', ”/data/www/session”);无效!
这个问题困扰了我几个小时,终于解决了,所以就记录下来,对日后应该会有帮助。

PHP 相关文章推荐
PHP自动更新新闻DIY
Oct 09 PHP
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
php中的登陆login实例代码
Jun 20 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
PHP中引用类型和值类型功能与用法示例
Feb 26 PHP
php接口隔离原则实例分析
Nov 11 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 PHP
PHPThumb图片处理实例
May 03 #PHP
PHP的preg_match匹配字符串长度问题解决方法
May 03 #PHP
PHP英文字母大小写转换函数小结
May 03 #PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 #PHP
php环境无法上传文件的解决方法
Apr 30 #PHP
php分页示例分享
Apr 30 #PHP
yii框架配置默认controller和action示例
Apr 30 #PHP
You might like
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
深入php数据采集的详解
2013/06/02 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
babel基本使用详解
2017/02/17 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
python中实现将多个print输出合成一个数组
2018/04/19 Python
python实现猜单词小游戏
2020/05/22 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
python爬虫---requests库的用法详解
2020/09/28 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
Html5页面内使用JSON动画的实现
2019/01/29 HTML / CSS
Linux常见面试题
2016/10/04 面试题
EJB3推出JPA的原因
2013/10/16 面试题
总经理的岗位职责
2014/02/23 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
2016年教代会开幕词
2016/03/04 职场文书
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL