• 关于session_start()这个问题


    关于session_start()这个问题,其实网上很多解决的方法,论坛也好多人回答这类的问题, 现在的状况是依然有警告提示Warning:

    session_start() [function.session-start]: Cannot send session cookie - headers already sent in C:phpphpdesigner_output_tmp.php on line 2

    不过,代码可以成功运行,$_SESSION的值可以传递到别的页面 ,现在先说我自己的问题.我在网上找session_start()的问题的时候,有的帖子提到要修改

    session.save_path =c: mp 和 session.cookie_path =/ 这两个路径为c: mp,然后再添加一个文件夹.

    但我自己是问题是,session.cookie_path  的值应该是=/  惭愧的是我现在还不明白什么是这个值应该是默认路径吧.

    其实相关的session_start()的问题还有要将session.auto_start = 0改为1,out.put_buffery=on 或者修改成4096 或者session_start()前面加ob_start();

    还有cache-limiter= ;空,还有apache的缓存是否有开等等,不过对我的问题也没有帮助而已.下面是我在找问题的答案的时候找到的一些关于session_start()的问题的总结

    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.问题:我是不是可以用像$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()]);

    }

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

    ==================================================================================

    =====session的部分设置问题====

    首先打开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('count');
    $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('count');  // 注册Session变量Count
    if(isset($PHPSESSID)) {
       session_id($PHPSESSID);
    }  // 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID
    $PHPSESSID = session_id();  // 取得当前的SessionID
    $count++;  // 变量count加1
    setcookie('PHPSESSID', $PHPSESSID, time()+3156000);  // 储存SessionID到Cookie中
    echo $count;  // 显示Session变量count的值
    ?>
    ------------------------------------------------------------------------------------ 

     保存之后,利用和刚才拥有服务器权限时候的检测一样的方法,检测是否成功的保存了SessionID。
    后记:
       其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……
    但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!

  • 相关阅读:
    React中的PropTypes详解
    mobile 更改hosts
    sed用例
    Centos 7 开启端口
    node-gyp rebuild 卡住?
    录制客户端脚本
    创建删除表空间以及表空间使用情况查询
    oracle 修改字符集 修改为ZHS16GBK
    linux中压缩、解压缩命令详解
    jps、jstack、jmap、jhat、jstat、hprof使用详解
  • 原文地址:https://www.cnblogs.com/baocheng/p/3816635.html
Copyright © 2020-2023  润新知