A session had already been started - ignoring session_start()

出现以下错误的解决办法:


PHP Notice: A session had already been started – ignoring session_start() in .. on line ..


之所以出现这种情况是页面中多次使用了 session_start()函数


有以下两种解决办法:


1) 编辑PHP配置文件修改参数vim/usr/local/php/etc/php.ini


session.auto_start = 1 1开启0关闭)如果程序中不需要自动开启,将其关闭即可。

174926387.png

服务器运行的程序A需要开启,所以设置成1,该机器复用,又运行了程序B,且不需要开启,所以就会用到2中的方法。


2) 在出现错误的页面中编辑你的代码如下:


if(!session_id()) session_start();替换session_start();

175021326.png



PHPinfo中显示session的相关参数开启情况

175315109.png




php会爆出警告提示:

Notice: A session had already been started - ignoring session_start() in ***\sina.php on line 2

错误提示:A session had already been started - ignoring session_start()

翻译过来说的是已经存在一个session被打开了 -- 忽略sessioon_start();
废话不多说,解决问题是关键,切入解决方法:
解决办法1: 在php.ini 中 修改成

session.auto_start = 0  // 0是关闭  1是打开

这还是和前面一样掩耳盗铃,屏蔽掉错误,但是治标不治本!我们还是要解决这个问题,那么请看下面方法:

解决办法2:
问题代码:

session_start();

这样写,其实不是错的,只是缺少了判断,因为有些用户已经在本站录入了session,再次请求就会重复,php爆出这个警告提示,是为了避免更多问题以及性能和安全!
解决这个问题很简单,写个判断呗!
判断 如果session_id 不存在,说明没有储存, 打开session,否则。。。。不多说了,下面代码替换吧

if (!session_id()) session_start();

session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的。session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,这个值可以从php.ini找到:

1session.name = PHPSESSID //默认值
  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_name()

session_name() 存取目前 session 名称。

语法: string session_name(string [name]);

本函数可取得或者重新配置目前 Session 的名称。若无参数 name 则表示单单获取目前 Session 名称,加上参数则表示将 Session 名称设为参数 name。

如果建立时是这样seesion_register("test");那么就可以用seesion_name("test")来找到这。session_id()这个函数是用来为会话进行编号就好像PHP数组一样支持字符和数字标识。

1<?php
2 
3    /* set the session name to NowaMagic */
4    $str = "NowaMagic";
5    session_name($str);
6     
7    echo session_name();
8 
9?>
session_name() 与 session_id() 的区别

我们先自己运行一次程序,看看输出结果:

1<?php
2    session_start();
3    echo session_name().'='.session_id();
4?>

运行结果:

1PHPSESSID=4d8d3ep8cakmvto6hvut3mphf4

现在可以明确了:

  • session_name() 默认为 "PHPSESSID"
  • 而 session_id() 是 一次HTTP 请求,服务器得到的 $_POST['PHPSESSID'] 或者 $_GET['PHPSESSID'] 或者 $_COOKIE['PHPSESSID']

如果你在 session_start() 前调用了 session_name('SID'); 那么正常情况下(客户端支持Cookie时), 会给客户端发送 Set-Cookie: SID=(session_id 的值);

小结

一句话:默认值是PHPSESSID,你可以用session_name()修改。

延伸阅读

此文章所在专题列表如下:

  1. PHP函数补完:get_magic_quotes_gpc()
  2. PHP函数补完:error_reporting()
  3. PHP函数补完:preg_match()
  4. PHP函数补完:urlencode()
  5. PHP函数补完:array_multisort()
  6. PHP函数补完:array_splice()
  7. PHP函数补完:isset()
  8. PHP函数补完:getenv()
  9. PHP函数补完:header()
  10. PHP函数补完:mysql_num_rows()
  11. PHP函数补完:list()
  12. PHP函数补完:mysql_query()
  13. PHP函数补完:mysql_fetch_array()
  14. PHP函数补完:number_format()
  15. PHP函数补完:explode()
  16. PHP函数补完:call_user_func()
  17. PHP函数补完:ImageCopyResamples()
  18. PHP函数补完:import_request_variables()
  19. PHP函数补完:parse_url()
  20. PHP函数补完:移除HTML标签strip_tags()
  21. PHP函数补完:输出数组结构与内容var_dump()
  22. PHP函数补完:var_export()
  23. PHP函数补完:判断变量是否为数字is_numeric()
  24. PHP函数补完:session_name()
  25. PHP函数补完:session_id()
  26. PHP函数补完:nl2br()与nl2p()函数
  27. PHP函数补完:shuffle()取数组若干个随机元素
  28. PHP函数补完:http_build_query()构造URL字符串
  29. PHP函数补完:stream_context_create()模拟POST/GET

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值