Fatal error: session_start(): Failed to initialize storage m
之前编译安装的LNMP环境+phpmyamdin4.02的版本,今天突然出现这个问题: 代码如下: 大致意思是session会话初始化的时候储存路径有误!第一反应就是查看php.ini的配置文件中的: 代码如下: 默认前面是加的分号,表示不启用,我之前配置的时候已经启用了。那为什么还会报错呢?,于是网上找了一些资料,感觉都千篇一律:1、检查error.log(Apache2.2logs)文件,查看是否有错误报告。未发现。 2、检查php.ini中的session.save_handler的值是否为files,如果不是改为files 3、检查php.ini文件中session.save_path是否被注释了,如果有,则去掉前面的”;”。 4、将save_path后面的路径改成已有的路径,比如”D:phptemp” 5、检查temp文件夹的属性是否可读可写。 6、重启APACHE服务器。OK 不知道那些哥们转载的时候自己试过了没有(在这里喷一下,最讨厌那种自己都没有亲测,就一股脑的转来转去。一点都不负责!) 代码如下: $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.关闭安全模式; 当然两种方法都要求你有服务器的权限。 代码如下: [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 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,input=src,form=fakeentry" ; Production Value: "a=href,form=fakeentry" ; http://php.net/url-rewriter.tags url_rewriter.tags = "a=href,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会话的文件夹。 代码如下: 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”); 就解决了这个问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |