`

session_start() 转

阅读更多
 session_start()这个问题,我竟然用了4天来解决.其实网上很多解决的方法,论坛也好多人回答这类的问题,不过最后呢,我还是先在我朋友的电脑上运行php的代码,确认没有写错后,再通过朋友的php.ini来对照,找出不同的地方,然后修改才成功. 现在的状况是依然有警告提示Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent in C:\php\phpdesigner_output_tmp.php on line 2 不过,代码可以成功运行,$_SESSION的值可以传递到别的页面,那我就不再修改其他的(还没对照到的地方).最后一句感叹,一个人凭兴趣去写程序,真是困难重重!

  现在先说我自己的问题.我在网上找session_start()的问题的时候,有的帖子提到要修改session.save_path =c:\tmp 和session.cookie_path =/
这两个路径为c:\tmp 然后再添加一个文件夹.但我自己是问题是,session.cookie_path  的值应该是=/  惭愧的是我现在还不明白什么是这个值应该是默认路径吧.

  其实相关的session_start()的问题还有要将out.put_buffery=on 或者修改成4096 或者session_start()前面加ob_start();还有cache-limiter= ;空,还有apache的缓存是否有开等等,不过对我的问题也没有帮助而已.下面是我在找问题的答案的时候找到的一些关于session_start()的问题的总结,我本来想自己总结,现在就贴出这位兄弟的文章就是了(没有问过他,如果有一天作者觉得有异议,请联系我)http://cmpford.bokee.com/


session问题集锦

  对于PHP的session功能,始终找不到合适的答案,尤其是一些错误,还有一些没有错误的结果,最可怕的就是后者,一直为许多的初学者为难。就连有些老手,有时都被搞得莫名其妙。本文,将这些问题,做一个简单的汇总,以便大家查阅。

1.
错误提示
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
分析及解决办法
这一类问题,的原因是你在程序中使用session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或print一条消息了。很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的session_start()调到程序的第一行。

2.
错误提示
Warning: open(F:/689phpsessiondatasess_66a39376b873f4daecf239891edc98b5, O_RDWR) failed
分析及解决方法
出现这样的错误语句一般是因为你的php.ini中关于session.save_path一项没有设置好,解决的方法是将session.save_path和session.cookie_path 设置置为
session_save_path = c: emp
session.cookie_path = c: emp
然后在c:目录下建立一个temp目录,即可

3.
错误提示
Warning: Trying to destroy uninitialized session in
分析及解决方法
出类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的运行,其实不然。解决的方法是在你调session_destroy()函数之前,要用session_start()开启session的功能。

4.问题:怎么获得当前session的id值呢?
最简单的方法是:
echo SID;
你会发现的。

5.问题:我的程序,在调用header函数之前没有任何的输出,虽然我include了一个config.php文件,但在config.php文件中也没有任何的输出,为什么session还是会报出与问题1同样的错误呢,是不是因为我在header之前用了session_start()的缘故呢?
答:或许你确实认真的检查了你的php程序,在引用header()之前确实也没有任何的输出,并且在你的include文件中也没有任何的输出!但是你是否用光标键在?>这个PHP代码结束语句后移动检查呢?那么你会发现在?>这个后面,有一个空行或几个空格,你删除了这几个空行或空格,那么问题就解决了。
注:此问题,会出PHP4.1.2中,更高版本,没有测试过。

6.问:用session做登录主页面后,其它页面怎么用session限制登录。。。
答:最简单的方法是
session_start();
if(!session_registered('login') ││ $login != true) {
echo "你没有登陆";
exit;
}

7.问:我用session_register()注册了session变量,可是当我用header或用javascript的重定向语句,那么在一下页面中,我却访问不到session所注册的变量值。请问如何解决?
问题的程序片段:
session_start();
$ok = 'love you';
session_register('ok');
header("location : next.php");
?>

next.php
session_start();
echo $ok;
?>

解决的方法:
当你用header函数或window.location这样的功能后,你上一个页面所注册的session变量,就会容易的丢失,关于这个问题的原因,至今仍没有一个详细的回答。
不过有解决的方法。如下所示
header("Location: next.php" ."?" . SID);
在跳转到下一页面的时候,将session的当前id做为一个参数,传到后一个页面。

8.session如何传数组
session_register('data');
$data=array(1,2,3,4);

方法是先注册后赋值

9.问题9:我是不是可以用像$HTTP_GET_VARS['**']方式来访问session值呢?

回答:可以,你可以使用如下global数组来访问session,以加强网页的安全性
$HTTP_SESSION_VARS
$_SESSION
例程:
session_start();
$username = 'stangly.wrong';
session_register('username');

echo $HTTP_SESSION_VARS['username'];
echo '
';
echo $_SESSION['username'];
?>
请参照此例程修改符合您自己的程序。

问题10:session_unregister() 和 session_destroy() 有何区别?
session_unregister()函数主要作用是注消当前的一sion.(译自于php.net)

例程:
if(isset($_COOKIE[session_name()])) {
session_start();
session_destroy();
unset($_COOKIE[session_name()]);
}


以上,所述是一些新手经常遇到的问题。或许是详述不清,难免有误所在,请高手指点批评。


php中的session的配置

今天调试程序遇到了session的设置问题,网上这篇文章比较好,共拿来学习,并供大家参考。
转载自旅行论坛 http://www/lvxing.net


首先打开php.ini文件,找到session的部分:(分号后面的是注释)

[Session]
; Handler used to store/retrieve data.
session.save_handler = files   ;    这个是session的方式,默认的files就可以了,代表用文件储存

; Argument passed to save_handler.  In the case of files, this is the path  where data files are stored.
session.save_path = /tmp ;      这个是session的保存路径,比如你是c盘,那么默认就是c:/tmp, 所以如果出现“Warning: open(/tmpsess_cc8b04f146a1e0494bc464305da92ea1, O_RDWR)  failed”这样子的错误,你可以修改这个路径,或者在根目录下面建立一个tmp的文件夹

; Whether to use cookies.
session.use_cookies = 1 ;    sessionid的传递方式,默认是cookie,推荐使用

; Name of the session (used as cookie name).
session.name = PHPSESSID ;    sessionid的名称,保存在cookie里面的,要避免同名

; Initialize session on request startup.
session.auto_start = 0 ;    是否自动启动session,默认为不是,不需要修改

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0 ;    sessionid的cookie生存时间,0代表知道浏览器关闭

; The path for which the cookie is valid.
session.cookie_path = / ;    sessionid的cookie路径,不需要修改

; The domain for which the cookie is valid.
session.cookie_domain = ;    ;sessionid的cookie域名,不需要修改

; Handler used to serialize data.  php is the standard serializer of PHP.
session.serialize_handler = php ;    保存data的默认文件名后缀,不需要修改

; Percentual probability that the 'garbage collection' process is started  on every session initialization.
session.gc_probability = 1

; After this number of seconds, stored data will be seen as 'garbage' and  cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440 ;    session文件的保存时间

; Check HTTP Referer to invalidate externally stored URLs containing ids.
session.referer_check = ; How many bytes to read from the file.
session.entropy_length = 0 ; Specified here to create the session id.
session.entropy_file = ;session.entropy_length = 16 ;session.entropy_file = /dev/urandom

; Set to {nocache,private,public} to determine HTTP caching aspects.
session.cache_limiter = nocache ; Document expires after n minutes.
session.cache_expire = 180 ; use transient sid support if enabled by compiling with --enable-trans-sid.
session.use_trans_sid = 1 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" ======================================================================
session 的生命周期是多长 

1 浏览器结束时其生命周期也同时结束,但是档案仍然存在于 /tmp/(sess_???)
2 下次重新开浏览器时会重新分配 sessionID,如果你使用 session_id() 把以前的 ID 带回来,
则会去读取残存在 /tmp 处的 sess_???, 取回你之前所有已经设定的参数
3 可以在 php.ini 里修改 session 档案残存的时间 session.gc_maxlifetime = 1440 ; after this number of seconds, stored
; data will be seen as 'garbage' and
; cleaned up by the gc process 默认是 1440 秒,24分钟
=========================================================================

使用无限生命期Session的方法
   在PHP4.0中加入了对Session的支持,方便了我们很多程序,比如购物车等等!
   在很多论坛中,Session也用于处理用户的登陆,记录下用户名和密码,使得用户不必每次都输入自己的用户名和密码!但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?
   大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……
   
   要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):
   1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
   2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值“PHPSESSID”;
   3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
   4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
   还有很多的设置,不过和本文相关的就是这些了,下面开始讲使用永久Session的原理和步骤。
   
   前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以……
   如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:
   1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改;
   2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别);
   3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;
   设置完毕后,打开编辑器,输入如下的代码:
------------------------------------------------------------------------------------

<?php  session_start();
session_register(&apos;count&apos;);
$count++;
echo $count;
?>
------------------------------------------------------------------------------------
   然后保存为“session_check.php”,用浏览器打开“session_check.php”,看看显示的是不是“1”,再关闭浏览器,然后再打开浏览器访问“session_check.php”,如果显示“2”,那么恭喜了,你已经成功;如果失败的话,请检查你前面的设置。
   
   但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的SessionID设置为给出的值……
   只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了!
   但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息!
------------------------------------------------------------------------------------


------------------------------------------------------------------------------------
   打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息(如图1所示)。其中有一项“session.name”的参数(图中已经标出),这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。
   记下了SessionID的名称后,我们就可以实现永久的Session数据储存了!
   打开编辑器,输入下面的代码:
------------------------------------------------------------------------------------
session_start();  // 启动Session
session_register(&apos;count&apos;);  // 注册Session变量Count
if(isset($PHPSESSID)) {
   session_id($PHPSESSID);
}  // 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID
$PHPSESSID = session_id();  // 取得当前的SessionID
$count++;  // 变量count加1
setcookie(&apos;PHPSESSID&apos;, $PHPSESSID, time()+3156000);  // 储存SessionID到Cookie中
echo $count;  // 显示Session变量count的值
?>
------------------------------------------------------------------------------------

保存之后,利用和刚才拥有服务器权限时候的检测一样的方法,检测是否成功的保存了SessionID。
后记:
   其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……
但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!关于Session的其他应用,可
以参见zphp.com的文章。
   最后,笔者的调试环境:Windows98DigExt(SE)+Apache+PHP 4.04。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuyuzhou06/archive/2007/11/27/1905017.aspx
分享到:
评论

相关推荐

    php session_start()出错原因分析及解决方法

    但是,在实际开发过程中,session_start()可能会因为多种原因导致错误。本文将分析常见的session_start()错误原因,并提供相应的解决方法。 1. 输出缓冲区未开启导致错误: 在PHP脚本中,如果在调用session_start()...

    Warning session_start

    ### 关于 "Warning session_start() [function.session-start] Cannot send session cookie" 的解决方案 在进行Web开发时,尤其是在使用PHP语言处理用户会话(session)的过程中,可能会遇到一个常见的错误提示:...

    php利用session_start查看浏览记录

    本篇文章将详细探讨如何使用`session_start()`来查看和管理用户的浏览记录。 首先,了解`session_start()`的工作原理。当在PHP脚本中调用`session_start()`时,它会在服务器上创建或恢复一个唯一的会话ID,并将此ID...

    PHP中Fatal error session_start()错误解决步骤

    Fatal error: session_start() [function.session-start]: Failed to initialize storage module: files (path: ) in C:\usr\phpMyAdmin\libraries\session.inc.php on line 75 I.更改服务器配置: 1、检查error.log...

    PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法

    做开发的时候,操作session有时候会遇到这个问题:Warning: session_start() [function.session-start]…… 系统环境:WIN2003+IIS6+PHP5.2.12 PHP出现类似如下错误: Warning: session_start()[function.session-...

    PHP session_start()问题解疑(详细介绍)

    确保在销毁session之前,先通过 `session_start()` 开启session功能。 4. **获取当前session ID** 要获取当前session的ID,你可以简单地使用 `echo SID;`。SID会自动包含当前session的ID。 5. **header函数之前无...

    Thinkphp3.2.3 Redis session驱动

    'SESSION_AUTO_START' =&gt; true, // 是否自动开启Session 'SESSION_TYPE' =&gt; 'Redis', //session类型 'SESSION_PERSISTENT' =&gt; 1, //是否长连接(对于php来说0和1都一样) 'SESSION_CACHE_TIME' =&gt; 3, //连接超时...

    php session_start()关于Cannot send session cache limiter – headers already sent错误解决方法

    说是已经有输出,用编辑器打,前面明明什么都没有,原来在使用AJAX的 时候,也出现过这种情况,后来,把这个PHP文件放到linux中打开,会发现,在文件的最前面,会出现“锘 ”这样的一个字符(引号内),把它去掉以后...

    php中session_id()函数详细介绍,会话id生成过程及session id长度

    需要注意的是,`session_id()` 必须在调用 `session_start()` 函数之前调用,以便正确地设置会话ID。 在会话处理中,会话ID是区分不同用户的关键,通常存储在客户端的Cookie中或通过URL传递。如果用户禁用了Cookie...

    Warning: session_destroy() : Trying to destroy uninitialized sessionq错误

    在这个例子中,`session_start()`首先启动session,然后你可以进行任何必要的session操作,最后调用`session_destroy()`来清除所有session数据。如果你在调用`session_destroy()`之前没有执行过`session_start()`,...

    php代码-session_destroy()的执行会销毁session_id()

    在这个例子中,我们首先通过 `session_start()` 启动session,然后取消设置所有session变量,最后调用 `session_destroy()` 来结束session。这样可以确保用户在注销后不会意外保留任何敏感信息。 然而,值得注意的...

    php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法

    在windows下编程,当使用session_start()方法的时候,有时会报session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/...

    PHP中header和session_start前不能有输出原因分析

    如果在`session_start()`之前有任何输出,会导致`Set-Cookie`头无法正常发送,从而影响会话的创建和管理。即使在某些情况下,PHP可能能够容忍轻微的输出,但这并不意味着这是安全或推荐的做法,因为它可能导致不一致...

    PHP程序设计-3期(KC016) 3.12.3销毁session常见问题.docx

    因此,确保在销毁Session之前,有正确地调用`session_start()`来开启Session: ```php session_start(); // 清空 Session 变量 foreach ($_SESSION as $key =&gt; $value) { unset($_SESSION[$key]); } // 销毁 ...

Global site tag (gtag.js) - Google Analytics