首页 > 编程技术 > php

Warning: session_start() [function.session-start]: Cannot send session cookie解决办法

发布时间:2016-11-25 17:40

在很多时间使用了session就会出来如下提示了,

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/u114264/include/db_mysql教程.class.php教程:1) in /home/u114264/login1.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/u114264/include/db_mysql.class.php:1) in /home/u114264/login1.php on line 3

分析最大的可能是在session_start()前面有字符输出包括空格 ,只要处理就好了,

还有一种方法直接给session_start()加上@session_start()就没事了。不推荐

地址解决方案。


最通常的解决方案。打开output_buffering = 4096;  全局性质。

 

第二种解决方案。


ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
 

注意的地方:


如果使用utf-8编码,一定要去掉UTF-8中的BOM,这都是因为utf-8编码文件含有的bom原因,而php4,5都是不支持bom的。去掉bom,可以用Notepad++打开转换一下。

php教程中解决各种应用的乱码问题

  1) 使用 标签设置页面编码

  这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx 可以为 GB2312、GBK、UTF-8(和 MySQL 不同,MySQL 是 UTF8)等等。因此,大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错误而产生乱码。但是有的时候我们会发现有了这句还是不行,不管 xxx 是哪一种,浏览器采用的始终都是一种编码,这个情况我后面会谈到。

  请注意, 是属于 HTML 信息的,仅仅是一个声明,仅表明服务器已经把 HTML 信息传到了浏览器。

  2) header("content-type:text/html; charset=xxx");

  这个函数 header() 的作用是把括号里面的信息发到 http 标头。如果括号里面的内容为文中所说那样,那作用和 标签基本相同,大家对照第一个看发现字符都差不多的。但是不同的是如果有这段函数,浏览器就会永远采用你所要求的 xxx 编码,绝对不会不听话,因此这个函数是很有用的。为什么会这样呢?那就得说说 http 标头和 HTML信息的差别了:

  http 标头是服务器以 http 协议传送 HTML 信息到浏览器前所送出的字串。而 标签是属于 HTML 信息的,所以 header() 发送的内容先到达浏览器,通俗点就是 header() 的优先级高于 (不知道可不可以这样讲)。假如一个 php 页面既有header("content-type:text/html;charset=xxx"),又有,浏览器就只认前者 http 标头而不认 meta 了。当然这个函数只能在 php 页面内使用。

  同样也留有一个问题,为什么前者就绝对起作用,而后者有时候就不行呢?这就是接下来要谈的Apache 的原因了。

  3) AddDefaultCharset

  Apache 根目录的 conf 文件夹里,有整个 Apache 的配置文档 httpd.conf。

  用文本编辑器打开 httpd.conf,第 708 行(不同版本可能不同)有 AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置整个服务器内的网页文件 http 标头里的字符集为你默认的 xxx字符集。有这行,就相当于给每个文件都加了一行 header("content-type:text/html; charset=xxx")。这下就明白为什么明明 设置了是 utf-8,可浏览器始终采用 gb2312 的原因。

  如果网页里有 header("content-type:text/html; charset=xxx"),就把默认的字符集改为你设置的字符集,所以这个函数永远有用。如果把 AddDefaultCharset xxx 前面加个"#",注释掉这句,而且页面里不含 header("content-type…"),那这个时候就轮到 meta 标签起作用了。

  下面列出以上的优先顺序:

  .. header("content-type:text/html; charset=xxx")

  .. AddDefaultCharset xxx

  ..

  如果你是 web 程序员,建议给你的每个页面都加个header("content-type:text/html;charset=xxx"),这样就可以保证它在任何服务器都能正确显示,可移植性也比较强。

  4) php.ini 中的 default_charset 配置:

  php.ini 中的 default_charset = "gb2312" 定义了 php 的默认语言字符集。一般推荐注释掉此行,让浏览器根据网页头中的 charset 来自动选择语言而非做一个强制性的规定,这样就可以在同台服务器上提供多种语言的网页服务。

php教程 字符串编码转换的常用几种方法

mb_convert_encoding()
PHP的内码转换函数
版本(PHP 4 >= 4.0.6, PHP 5)
这个函数可以将各种编码互相转换

做一个GBK To UTF-8
< ?php
header("content-Type: text/html; charset=Utf-8");
echo mb_convert_encoding("你是我的友仔", "UTF-8", "GBK");
?>

再来个GB2312 To Big5
< ?php
header("content-Type: text/html; charset=big5");
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");
?>


iconv()
php内码转换函数,同上
因为iconv()在转换gb2312时的bug,所以要这样处理

PHP codeiconv( "UTF-8", "gb2312//IGNORE" , $str)

ignore的意思是忽略转换时的错误,发现iconv在转换字符"—"到gb2312时会出错,如果没有

ignore参数,所有该字符后面的字符串都无法被保存。
另外mb_convert_encoding没有这个bug,所以最好的写法是:
PHP codemb_convert_encoding($str,"gb2312", "UTF-8");

但是需要先enable mbstring 扩展库。
也可以把mysql教程数据库教程的collation设成utf-8就不用作转换了
三句mysql真言
SQL code
SET NAMES utf8;
SET CHARACTER SET utf8;
SET COLLATION_CONNECTION='utf8_general_ci';


自定函数1
--------------------------------------------------------------------------------

---
网上找的转换函数,将GB2312进行转换的,修改为utf-8后转换错误,无法解析中文.....期待正

则狂人...
PHP code<?php
function escape($str) {
         preg_match_all("/[x80-xff].|[x01-x7f]+/",$str,$r);
        $ar = $r[0];
        foreach($ar as $k=>$v) {
                 if(ord($v[0]) < 128)
                            $ar[$k] = rawurlencode($v);
                 else
                            $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
                                                     }
        return join("",$ar);
}

function unescape($str) {
       $str = rawurldecode($str);
       preg_match_all("/(?:%u.{4})|.+/",$str,$r);
       $ar = $r[0];
       foreach($ar as $k=>$v) {
                if(substr($v,0,2) == "%u" && strlen($v) == 6)
                $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4)));
                  }
       return join("",$ar);
}
?>


自定函数2
--------------------------------------------------------------------------------

---
感谢论坛gingzai777 ,高手就是不一样,一眼就能看出问题所在.....
以后php过滤用这个行了,不需要顾虑文件编码了.....
PHP code<?php
function addslashes_str($str){
$str=addslashes($str);
$str=str_replace($str,";",';');
return $str;
}
function strips教程lashes_str($str){
$str=stripslashes($str);
$str=str_replace($str,';',";");
return $str;
}
?>

Warning: session_start() [function.session-start]: open_basedir restriction in effect. File解决方法

Warning: include() [function.include]: open_basedir restriction in effect. File(/www/webpublic_html/admin/inc/inc.php教程) is not within the allowed path(s): (/www/webpublic_html/searchhight:/tmp) in /www/webpublic_html/searchhight/index.php on line 2

Warning: include(/www/webpublic_html/admin/inc/inc.php) [function.include]: failed to open stream: Operation not permitted in /www/webpublic_html/searchhight/index.php on line 2

Warning: include() [function.include]: Failed opening '/www/webpublic_html/admin/inc/inc.php' for inclusion (include_path='.:/www/wdlinux/php-5.2.17/lib/php') in /www/webpublic_html/searchhight/index.php on line 2

Fatal error: Class 'Db' not found in /www/webpublic_html/searchhight/index.php on line 3


Fatal error : session_start() [<a href='function.session-start'>function.session-start</a>]: Failed to initialize storage module: files (path: ) in E:footloginlogin.php on line 4

开启了session_start()后出现了这个问题。
php.ini 的open_basedir中加入C:WINDOWSTEMP

,修改.ini文件是很容易出错的。因为该配置文件不是仅仅服务一个程序,所以修改配置文件,带来的后果

可能有很大的影响。通过

ini_set ( 'session.save_path' , dirname ( __FILE__ ) . '/../dirname/' ) ;

设置php教程.ini 脚本超时方法

设置有二种
方法一,在php.ini里面设置

max_execution_time = 1800     ;

当前上面方法可以利用ini_set("选项","值"),
ini_set(''max_execution_time'', ''180'');

方法二 利用php页面中加

set_time_limit(),

如在php文档开始处加上set_time_limit(100),代表为100秒超时哦。

标签:[!--infotagslink--]

您可能感兴趣的文章: